잠금

2013-02-16 2 views
1

는 이제, 나는 ReentrantLock잠금

ReentrantLock foo = new ReentrantLock(); 

잠금을 사용하는 방법 bar,

public void bar() 
{ 
    foo.lock(); 

    try 
    { 
     methodOne(); 
    } 
    finally 
    { 
     foo.unlock(); 
    } 
} 

methodOne 또한 잠금을 사용하는 방법 methodTwo를 호출을 가정 해 봅시다 제대로 범위하는 방법 ,

public void methodTwo() 
{ 
    foo.lock(); 

    try 
    { 
     // do something 
    } 
    finally 
    { 
     foo.unlock(); 
    } 
} 

내가 methodOne로 전화하기 전에 bar에 전자 잠금 장치가 있습니까? 일반적으로 다른 메서드를 호출하기 전에 잠금을 해제하는 것이 좋습니다.

답변

3

아니요, 그렇게해서는 안됩니다. 그렇게하면, 동시 스레드는 bar() 메소드의 중간에 잠금을 획득 할 수 있습니다. 잠금은 잠금을 사용하여 피하고자하는 것입니다.

동일한 스레드에서 잠금을 여러 번 획득 할 수 있기 때문에이를 ReentrantLock이라고합니다. 카운터는 lock()이 호출 될 때마다 증가되고 unlock()이 호출 될 때마다 감소하므로 항상 unlock()이 finally 블록에서 항상 호출되는지 확인해야합니다.

동기화 된 블록을 닫는 것을 잊어 버릴 수 없기 때문에 코드를 단순히 동기화 된 블록을 사용하면 덜 취약 할 수 있습니다.

2

잠금 장치가 "보호하는"중요한 작업이 완료되면 잠금 장치를 해제하십시오. 하자마자.