【问题标题】:Java - ReentrantLock, lock could not be unlockedJava - ReentrantLock,锁无法解锁
【发布时间】:2023-10-13 10:41:01
【问题描述】:

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

【问题讨论】:

  • 请提供来源,仅从日志输出很难分辨

标签: java multithreading reentrantlock


【解决方案1】:

戴上他的占卜帽

您的日志包含对两个不同锁的引用 - 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 分钟的时间编写一个有趣的例子来看看这是怎么做到的完成)。不过,这些解释的可能性远低于上述解释。

【讨论】: