2009-10-15 4 views
23

내 질문에 ReentrantLock을 사용하면 synchronized 키워드가 제공하는 것과 동일한 관점에서 필드의 가시성이 보장되는지 여부가 언급됩니다. 예를 들어ReentrantLock을 통해 액세스 한 필드에 휘발성 키워드가 필요합니까?

, 다음 클래스 , sharedData이 동기화 된 키워드가 사용되는 휘발성 선언 할 필요가없는 분야이다.

class A 
{ 
    private double sharedData; 

    public synchronized void method() 
    { 
    double temp = sharedData; 
    temp *= 2.5; 
    sharedData = temp + 1; 
    } 
} 

ReentrantLock을 사용하는 다음 예제에서는 필드의 휘발성 키워드가 필요합니까?

class B 
{ 
    private final ReentrantLock lock = new ReentrantLock(); 
    private volatile double sharedData; 

    public void method() 
    { 
    lock.lock(); 
    try 
    { 
     double temp = sharedData; 
     temp *= 2.5; 
     sharedData = temp + 1; 
    } 
    finally 
    { 
     lock.unlock(); 
    } 
    } 
} 

필자는 volatile 키워드를 사용하면 성능이 약간 저하 될 수 있다고 생각하지만, 올바르게 코딩하는 것이 좋습니다.

답변

28

휘발성이 없어도 안전합니다. ReentrantLockLock를 구현하고 docs for Lock이 포함

모든 Lock 구현에 의해 제공 의미가 같은 메모리 동기화를 시행해야합니다 내장 모니터 락, 자바 언어 스펙, 제 3 판에 설명 된대로 (17.4 메모리 모델)이

  • 성공적인 lock 조작 와 같은 메모리 동기 효과가있다 성공 Lock 조치.
  • 성공적인 unlock 작업은 동기화 작업이 성공 Unlock 동작으로 동일한 메모리를가집니다.
+0

필드 호이 스팅으로 인한 'while (field)'과 관련하여이 조언이 사실입니까? – Pod

+0

@Pod : while 루프가 잠금 장치와 상호 작용하는 방식에 대한 자세한 내용이 없으면 말할 수 없습니다. 특정 예제로 새로운 질문을 만들고 싶을 것입니다. –

관련 문제