Java - ReentrantLock,锁定无法解锁

时间:2016-04-04 13:05:14

标签: java multithreading reentrantlock

以下是线程锁定之前和线程解锁之后的所有信息。我使用方法lock()和解锁()ReentrantLock。但是,虽然某些进程已解锁锁,但另一个进程无法锁定同一锁。

enter image description here

1 个答案:

答案 0 :(得分:0)

戴上他的占卜帽

您的日志包含对两个不同锁的引用 - java.util.concurrent.locks.ReentrantLock@1624f737java.util.concurrent.locks.ReentrantLock@17b002cd。你的问题并不清楚你到底在做什么以及是否有意使用两个锁,但我们假设它是。

每当您记录已释放两个锁中的一些时,锁的字符串表示仍包含[Locked by thread Thread-X]。如果您是从同一个线程进行日志记录,那么在尝试解锁后,您应该会看到[Unlocked]后缀(请参阅the Javadoc of ReentrantLock.toString()

看起来你有一些很小但非常重要的代码错误。

最有可能的是,您已从当前锁定所有者多次调用ReentrantLock.lock(),并且您尝试通过调用ReentrantLock.unlock()一次(或更一般地,小于数字)来释放锁定你称之为lock())的时间。

还有其他可能的解释 - 例如如果你吞下所有抛出的异常,你可能会尝试从错误的线程中解锁而不注意(在这种情况下应该抛出IllegalMonitorStateException;我只花了10分钟编写一个例子给看看如何做到这一点)。不过,这些解释比上面的解释要少得多。