我有一段代码(简化):
if(reentrantLockObject.isLocked()) {
reentrantLockObject.unlock();
}
其中reentrantLockObject是java.util.concurrent.locks.ReentrantLock。 有时我得到IllegalMonitorStateException。 它接缝在check和unlock()调用之间释放了锁。 如何防止此异常?
答案 0 :(得分:20)
isLocked
返回任何线程是否持有锁。我想你想要isHeldByCurrentThread
:
if (reentrantLockObject.isHeldByCurrentThread()) {
reentrantLockObject.unlock();
}
话虽如此,isHeldByCurrentThread
被记录为主要用于诊断目的 - 这段代码是正确的方法是不寻常的。你能解释为什么你认为你需要它吗?
答案 1 :(得分:6)
你需要拥有锁才能解锁它。 reentrantLockObject.isLocked()仅在某些线程拥有锁定时才为真,不一定是你。
reentrantLockObject.lock();
try{
// do stuff
}finally{
reentrantLockObject.unlock();
}
这里线程拥有锁,因此他们可以解锁。
答案 2 :(得分:3)
ReentrantLock
根据这个逻辑抛出此异常:
if (Thread.currentThread() != getExclusiveOwnerThread()) {
throw new IllegalMonitorStateException();
}
所以解决方法是检查同一个线程是否正在解锁:
if (reentrantLockObject.isHeldByCurrentThread()) {
reentrantLockObject.unlock();
}