2013-07-24 4 views
2

내 프로그램이 finally 블록 내부에서 잠금 해제 할 때 IllegalMonitorStateException을 던졌습니다. Javadoc에 의하면,이 예외는 「현재의 thread가이 락을 보관 유지하지 않는 경우」에 슬로우됩니다. 그러나 프로그램이 finally 블록에 도달하면 잠금을 획득해야합니다. 잠금 장치는 전에는 잠금 해제되어 있지 않습니다. 자물쇠가 "길을 잃을 수 있습니까?"ReentrantReadWriteLock이 손실 됨 - IllegalMonitorStateException이 throw 됨

코드 예 : 두 종류의 의미가 다르므로 ReentrantReadWriteLockReentrantLock을 업그레이드 할 때

final ReadWriteLock rwLock = new ReentrantReadWriteLock(); 

public void doSomething() { 
    Lock lock = rwLock.writeLock(); 
    try { 
     doStuff(); 
    } finally { 
     lock.unlock(); 
    } 
} 

답변

3

문제가 발생한다. 이 코드는 예상대로 작동합니다

이 차이는, lock.lock() [선택적으로 다음을 기다리는 및] 예상대로 현재 스레드에 대한 잠금을 걸립니다
final Lock lock = new ReentrantLock(); 

public void doSomething() { 
    lock.lock(); 
    try { 
     doStuff(); 
    } finally { 
     lock.unlock(); 
    } 
} 

하지만 rwLock.writeLock()ReentrantReadWriteLock 인스턴스의 쓰기 잠금 부분을 반환하고 아무튼에만 않습니다 아무것도 자르려고하지 마라.

final ReadWriteLock rwLock = new ReentrantReadWriteLock(); 

public void doSomething() { 
    rwLock.writeLock().lock(); 
    try { 
     doStuff(); 
    } finally { 
     rwLock.writeLock().unlock(); 
    } 
} 

게터 방법 writeLock() - 그리고 같은 스레드마다에 대해 동일한 잠금 -return readLock()을, 이렇게 얻어진 잠금 장치에 보관 할 필요가 없습니다 : this example에 관해서는, 코드는 같아야합니다 나중에 잠금을 해제 할 수있는 변수를 사용하면 단순히 "동일"해야하기 때문에 "이전 하나"의 잠금을 해제하기 위해 "새 것을"얻을 수 있습니다. (Thread.currentThread()은 정적이기 때문입니다.)