在我的計劃,我使用從併發:Condition.awaitNanos()不釋放鎖
private static final Lock lock = new ReentrantLock();
創建像這樣一個條件對象:
private static final Condition operationFinished = MyClass.lock.newCondition();
偶爾(因爲它總是與發生併發問題)我遇到以下行爲:
- Thread1獲得鎖
- Thread1調用
operationFinished.awaitNanos()
- 這應該暫停Thread1並釋放鎖。 - 線程2試圖將收購同一個鎖,但是在調試輸出顯示線程1仍然持有鎖!
根據文檔,此行爲是不可能的,因爲在awaitNanos()
上Thread1首先釋放鎖,然後掛起。 如果它沒有釋放鎖,那麼它不會掛起,因此Thread2甚至永遠不可能試圖鎖住鎖。
有沒有人遇到過類似的東西嗎?這個錯誤發生在100次 - 但仍然表明我要麼沒有以正確的方式使用併發實用程序,要麼在java.utils.concurrent。*包中存在某種錯誤(我懷疑) 。
UPDATE:
針對彼得斯答案:
我注意到以下行爲:顯然,2個線程死鎖對方。我可以看到Thread2阻塞(等待鎖定),同時Thread1中的awaitNanos()
也不會超時。
Thx爲您的迴應!用更多信息更新了我的答案:由於我可以在'lock()'上看到Thread2阻塞,因此鎖定仍然由Thread1保存。 – quaylar 2012-03-07 15:15:51
並且Thread1在awaitNanos()中是明確的嗎?你可以向我們展示這兩個線程和任何其他可能持有鎖的線程的堆棧跟蹤。例如從'jstack' – 2012-03-07 15:29:48
我意識到當Thread1仍然不在awaitNanos()中時,可能有Thread2嘗試獲取鎖的可能性。但即使在這種情況下,Thread2也會阻塞,直到Thread1調用awaitNanos(),然後再獲取鎖... – quaylar 2012-03-07 15:34:05