答案 0 :(得分:0)
戴上他的占卜帽
您的日志包含对两个不同锁的引用 -
java.util.concurrent.locks.ReentrantLock@1624f737
和java.util.concurrent.locks.ReentrantLock@17b002cd
。你的问题并不清楚你到底在做什么以及是否有意使用两个锁,但我们假设它是。
每当您记录已释放两个锁中的一些时,锁的字符串表示仍包含[Locked by thread Thread-X]
。如果您是从同一个线程进行日志记录,那么在尝试解锁后,您应该会看到[Unlocked]
后缀(请参阅the Javadoc of ReentrantLock.toString()
)
看起来你有一些很小但非常重要的代码错误。
最有可能的是,您已从当前锁定所有者多次调用ReentrantLock.lock()
,并且您尝试通过调用ReentrantLock.unlock()
一次(或更一般地,小于数字)来释放锁定你称之为lock()
)的时间。
还有其他可能的解释 - 例如如果你吞下所有抛出的异常,你可能会尝试从错误的线程中解锁而不注意(在这种情况下应该抛出IllegalMonitorStateException
;我只花了10分钟编写一个例子给看看如何做到这一点)。不过,这些解释比上面的解释要少得多。