2011-10-29 5 views
1

javadoc을 올바르게 해석하는지 잘 모르겠습니다. lock 메서드를 호출하고 성공적으로 잠금을 얻은 후에 ReentrantLock을 사용하면 동기화 된 블록이없는 개체에 액세스 할 수 있으며 happend-before 관계가 마술로 적용됩니까?Java 잠금 및 happend-before 관계

ReentrantLock과 제가 작업하고있는 개체 사이에 아무런 연결이 보이지 않습니다. 그래서 내가 안전하게 작업 할 수 있다고 믿기 어렵습니다. 하지만이 경우, 또는 내가 javadoc을 잘못 읽고 있습니까?

답변

4

다음 스레드 B는 볼 코드 블록 CB1에서 스레드 A에 의해 수행 된 수정.

두 스레드가 동일한 공유 상태를 읽고 쓰는 경우이 상태에 대한 모든 읽기 및 쓰기는 동일한 잠금에 의해 보호되어야합니다.

2

그것은이다 ... A (뮤텍스) 잠금 :

void myMethod() 
{ 

    myLock.lock(); // block until condition holds 
    try 
    { 
     // Do stuff that only one thread at a time should do 
    } 
    finally 
    { 
     myLock.unlock() 
    } 
} 

만 한 번에 하나의 스레드 잠금을 보유 할 수 있으므로 lock()unlock() 통화 사이의 어떤 만에 하나 개의 스레드에 의해 실행되는 보장 시간.

스레드 A가 로크에 의해 보호 된 코드 블록 CB1 안에 어떤 객체를 수정하고 잠금을 해제하고, 스레드 B가 동일한 로크 지키고 코드 블록에 들어가는 경우

The relevant Oracle tutorial can be found here.

+0

그래, 내가 독점적으로 처형되는 것을 이해하지만 같은 질문이 다른 스레드에서 볼 수 있다면 내 질문이 목표였습니다. –

+1

당신이 말하는 것은 자바가 각 스레드에 변수를 저장하는 방법입니다. 잠금을 사용하거나'synchronized' 키워드를 사용하면 동기화가 보장됩니다. [이 그래서 질문] (http://stackoverflow.com/questions/5022100/when-does-java-thread-cache-refresh-happens) 나는 당신의 질문에 더 완벽하게 대답을 생각합니다. 특히 JLS의 17.1 절 –

2

마술은 없습니다. 객체에 액세스하는 모든 스레드가 동일한 잠금을 사용하는 경우에만 안전합니다. ReentrantLock이거나 synchronized 블록과 같은 다른 뮤텍스 일 수 있습니다.

존재 ReentrantLocksynchronized보다 더 많은 유연성을 제공하여 정당화 : 당신은, 예를 들어, 단지 잠금 획득을 시도 할 수 있습니다 - synchronized 불가능합니다.