在我的程序中,我正在使用从一个对象创建的Condition对象。
private static final Lock lock = new ReentrantLock();
就像这样:
private static final Condition operationFinished = MyClass.lock.newCondition();
偶尔(并发问题总是会出现这种情况)我会遇到以下行为:
- Thread1获取锁
- Thread1调用
operationFinished.awaitNanos()
- 这应该挂起Thread1并释放锁。 - Thread2尝试获取相同的锁,但调试输出显示Thread1仍然持有锁!
awaitNanos()
上,Thread1首先释放锁,然后挂起。如果它没有释放锁,那么它就不会挂起,因此Thread2甚至无法获得获取锁的机会。有人经历过类似的情况吗?这个错误只会在100次中发生一次 - 但仍表明我要么没有正确使用并发工具,要么java.utils.concurrent.*包中存在某种错误(我怀疑)。
更新:
作为对Peter答案的回应:
我观察到以下行为:显然,两个线程互相死锁。我可以看到Thread2被阻塞(等待锁),同时Thread1中的
awaitNanos()
从未超时。
lock()
上阻塞。 - quaylarjstack
。 - Peter Lawrey