繁体   English   中英

并发:Condition.awaitNanos()没有释放锁

[英]Concurrency: Condition.awaitNanos() not releasing lock

在我的程序中,我正在使用从a创建的Condition对象

private static final Lock lock = new ReentrantLock();

像这样:

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

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

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

根据文档,这种行为是不可能的,因为在awaitNanos()上, awaitNanos()首先释放锁,然后暂停。 如果它没有释放锁,那么它就不会挂起,因此Thread2甚至无法试图抓住锁。

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

更新:

回应彼得斯回答:

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

根据您查看此信息的方式,我已经看到许多示例,其中对象上的多个线程wait()仍然表示它们都持有相同的锁。 可能是堆栈跟踪或监控错误导致。

假设你有持有锁的thread1,但在awaitNanos()中,你有Thread2试图获取lock(),但有时Thread3也持有锁....

我会做一个jstack -l {pid}来检查可能持有锁的所有线程。

如果锁死锁,awaitLock(也不是wait())将不会返回,因为它必须在执行此操作之前获取锁。 (除非被打断)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM