在我的程序中,我使用的是从

private static final Lock lock = new ReentrantLock();

像这样:
private static final Condition operationFinished = MyClass.lock.newCondition();

偶尔(因为它总是发生在并发问题中)我遇到以下行为:
  • 线程 1 获取锁
  • Thread1 调用 operationFinished.awaitNanos() - 这应该挂起 Thread1 并释放锁。
  • Thread2 尝试获取相同的锁,但调试输出显示 Thread1 仍然持有锁!

  • 根据文档,这种行为是不可能的,因为在 awaitNanos() Thread1 首先释放锁然后挂起。
    如果它没有释放锁,那么它就不会挂起,因此 Thread2 甚至永远不可能尝试获得锁。

    有没有人经历过类似的事情?此错误发生 100 次 - 但它仍然表明我没有以正确的方式使用并发实用程序,或者 java.utils.concurrent.* 包中存在某种错误(我对此表示怀疑) .

    更新:

    针对彼得斯的回答:

    我观察到以下行为:显然 2 个线程彼此死锁。我可以看到 Thread2 阻塞(等待锁定),同时 Thread1 中的 awaitNanos() 永远不会超时。

    最佳答案

    你确定等待时间还没有结束?如果您等待一小段时间(例如,几百纳秒),则等待时间可能会在 Thread2 完全启动之前到期,在这种情况下,可能会首先重新激活 Thread1。

    关于java - 并发:Condition.awaitNanos() 不释放锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9603575/

    10-12 19:54