在我的程序中,我使用的是从
private static final Lock lock = new ReentrantLock();
像这样:
private static final Condition operationFinished = MyClass.lock.newCondition();
偶尔(因为它总是发生在并发问题中)我遇到以下行为:
operationFinished.awaitNanos()
- 这应该挂起 Thread1 并释放锁。 根据文档,这种行为是不可能的,因为在
awaitNanos()
Thread1 首先释放锁然后挂起。如果它没有释放锁,那么它就不会挂起,因此 Thread2 甚至永远不可能尝试获得锁。
有没有人经历过类似的事情?此错误发生 100 次 - 但它仍然表明我没有以正确的方式使用并发实用程序,或者 java.utils.concurrent.* 包中存在某种错误(我对此表示怀疑) .
更新:
针对彼得斯的回答:
我观察到以下行为:显然 2 个线程彼此死锁。我可以看到 Thread2 阻塞(等待锁定),同时 Thread1 中的
awaitNanos()
永远不会超时。 最佳答案
你确定等待时间还没有结束?如果您等待一小段时间(例如,几百纳秒),则等待时间可能会在 Thread2 完全启动之前到期,在这种情况下,可能会首先重新激活 Thread1。
关于java - 并发:Condition.awaitNanos() 不释放锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9603575/