以下是线程被锁定之前和线程解锁后的所有信息。我正在使用方法 lock() 和 unlock() ReentrantLock。但是,尽管某个进程已经解锁了锁,但另一个进程无法锁定同一个锁。
1 回答
戴上他的占卜帽
您的日志包含对两个不同锁的引用 -
java.util.concurrent.locks.ReentrantLock@1624f737
和java.util.concurrent.locks.ReentrantLock@17b002cd
. 您的问题并没有很清楚地说明您到底在做什么以及拥有两个锁是否是故意的,但让我们假设它是。
每当您记录您已经释放了两个锁中的一些时,锁的字符串表示仍然包含[Locked by thread Thread-X]
. 如果您从同一个线程进行日志记录,恰好在尝试解锁锁之后,您应该会看到一个[Unlocked]
后缀(请参阅的 JavadocReentrantLock.toString()
)
看起来你有一些小但非常重要的代码错误。
最有可能的是,您已经ReentrantLock.lock()
从锁的当前所有者多次调用,并且您试图通过调用ReentrantLock.unlock()
一次来释放锁(或更一般地说,少于您调用的次数lock()
)。
还有其他可能的解释——例如,如果你正在吞下所有抛出的异常,你可能会在没有注意到的情况下尝试从错误的线程中解锁(IllegalMonitorStateException
在这种情况下应该抛出;我刚刚花了 10 分钟编写一个有趣的例子看看如何做到这一点)。尽管如此,这些解释比上述解释的可能性要小得多。