2015-09-16 32 views
-3

在这个例子中:在可能已经解锁的锁上调用unlock()是否安全?

private ReentrantReadWriteLock mLock = new ReentrantReadWriteLock(); 

public void method(boolean condition) { 
    try { 
     mLock.writelock.lock() 

     if (condition) { 
      mLock.writelock.unlock(); 
     } 
    } finally { 
     mLock.writelock.unlock(); 
    } 
} 

什么时候mLock.writelock.unlock()finally块,如果在if声明解锁已被执行所谓的发生?

此代码是否安全?或者我需要执行一些检查,试图解锁之前是否存在锁定?

+1

[javadoc说什么?](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.WriteLock.html#unlock--) –

+0

您花更多的时间来形成这个问题,而不是自己试试。 –

回答

1

根据文档,它看起来非常直截了当,在重新执行ReentrantReadWriteLock.WriteLock.html#unlock时应该丢弃IllegalMonitorStateException

尝试释放此锁定。如果当前线程是该锁的持有者,则保持计数递减。如果保持计数现在为 零,则锁定被释放。如果当前线程不是该锁的持有者,则抛出IllegalMonitorStateException。

Documentation Link

强制条件对最终解开执行也将其从异常逃脱。

相关问题