2012-02-14 3 views
0

멀티 스레딩하는 응용 프로그램이 있습니다. 변수가 여러 스레드에 의해 공유 될 때 기존 코드가 volatile로 표시된다는 것을 알았습니다. 변수를 사용할 때 메서드에서 synchronized를 사용하는 것이 아니라 변수를 volatile로 정의하면 어떤 이점이 있습니까?Java 가변 변수, 멀티 스레딩

+3

내 머리 꼭대기에서 - 어떻게 작동하는지 이해하지 못한다면 만지지 마세요 –

+2

수십 개의 웹 페이지가 설명되어 있습니다. –

+0

웹에서 "Java 메모리 모델" – Miquel

답변

6

의미 :

  • 이 변수의 값은 스레드 로컬로 캐시되지 않습니다 : 모든 읽기 및 직선에 "메인 메모리"갈 것이다 쓴다;
  • 변수에 대한 액세스는 동기화 된 블록으로 묶여있는 것처럼 작동합니다 (자체적으로 동기화 됨). 즉

, 동기화 및 휘발성의 주요 차이점은 다음과 같습니다

  • 원시적 변수가 (당신이 동기화와 원시적에 동기화 할 수있는 반면) 휘발성 선언 할 수있다;
  • 휘발성 변수에 대한 액세스는 차단할 가능성이 없습니다. 단순한 읽기 또는 쓰기 만 수행하므로 동기화 된 블록과 달리 잠금을 유지하지 않습니다.
  • 휘발성 변수에 액세스하면 잠금이 유지되지 않으므로, "업데이트를 잃어 버릴 준비가되어 있지 않으면"원자 연산으로 읽기 - 업데이트 - 쓰기를 원하는 경우에는 적합하지 않습니다.
  • 개체 참조 인 휘발성 변수는 null 일 수 있습니다 (실제 개체가 아닌 참조에서 효과적으로 동기화하기 때문에).

자세한 내용은 다음과 같습니다 http://javamex.com/tutorials/synchronization_volatile.shtml

0

here에서 촬영 : (당신이 동기화와 원시적에 동기화 할 수있는 반면)

  • 원시적 변수가 휘발성 선언 할 수있다;

  • 휘발성 변수에 액세스 결코 차단할 수있는 가능성이 없다 : 동기화 된 블록과는 달리, 우리는 이제까지 간단한 읽기를하고 또는 쓰기있는 정도 우리 것 어떤 잠금에 결코 보류; 휘발성 변수에 접근하는 것은 결코 잠금을 보유하지 않기 때문에 우리가 읽을 업데이트 쓰기를 하기 위해 원자 작업으로 (우리가 에 준비하지 않는 한 "업데이 트를 그리워") 원하는 위치

  • , 그것은 경우에 적합하지 않습니다 ;

  • 개체 참조 인 휘발성 변수는 이 null 일 수 있습니다. 실제 개체가 아닌 을 효과적으로 동기화하기 때문입니다. 휘발성 자바 변수를 선언

1

동기화 사용하는 것보다 훨씬 간단하고 빠르게 당신에게 도움이 될 수 있습니다.

더 간단하기 때문에 사용이 제한적이지만 volatile이 필요한 경우 왜 동기화를 사용해야합니까? ;)

0

간단히 말해 하나 이상의 변수 (상태)가 스레드간에 공유되는 경우에만 volatile을 사용해야합니다. synchronized, less intuitive도 저렴합니다. 휘발성 상태를 유지하는 하나 이상의 변수가 문제가됩니다.