在没有IllegalMonitorStateException的情况下解锁ReentrantLock

时间:2010-05-11 13:51:57

标签: java concurrency locking

我有一段代码(简化):

if(reentrantLockObject.isLocked()) {
       reentrantLockObject.unlock();
}

其中reentrantLockObject是java.util.concurrent.locks.ReentrantLock。 有时我得到IllegalMonitorStateException。 它接缝在check和unlock()调用之间释放了锁。 如何防止此异常?

3 个答案:

答案 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();
}