[英]Concurrency: Condition.awaitNanos() not releasing lock
在我的程序中,我正在使用从a创建的Condition对象
private static final Lock lock = new ReentrantLock();
像这样:
private static final Condition operationFinished = MyClass.lock.newCondition();
偶尔(因为它总是发生并发问题)我遇到以下行为:
operationFinished.awaitNanos()
- 这应该挂起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.