gpt4 book ai didi

java - 并发:Condition.awaitNanos() 不释放锁

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:30 25 4
gpt4 key购买 nike

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

创建的条件对象
private static final Lock lock = new ReentrantLock();

像这样:

private static final Condition operationFinished = MyClass.lock.newCondition();

偶尔(因为并发问题总是发生)我遇到以下行为:

  1. Thread1 获取锁
  2. Thread1 调用 operationFinished.awaitNanos() - 这应该挂起 Thread1 并释放锁。
  3. 线程 2 尝试获取相同的锁,但调试输出显示线程 1 仍持有锁!

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

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

更新:

回应彼得斯的回答:

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

最佳答案

您确定等待时间还没有结束吗?如果您等待的时间很短(例如几百纳秒),等待时间可能会在线程 2 完全启动之前到期,在这种情况下,线程 1 可能会首先重新激活。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com