2009-11-12 209 views
1

如果線程持有ReentrantReadWriteLock.writeLock()停止執行,由於未捕獲到異常,被鎖釋放,抑或是舉行,現在所有的其他線程死鎖?會發生什麼?

回答

3

我假設通過「失敗」,你的意思是一個未捕獲的異常傳播離開線程的頂端run方法,導致它停止執行。

如果線程使用finally正確阻塞,那麼它將在備份堆棧的過程中解鎖writeLock

但是,如果線程沒有調用unlock(),它仍然保持該監視器,即使它不再運行 - 所以是的,其他線程將會死鎖。

這就是爲什麼它是獲取和正確釋放資源的關鍵重要。而且也是一個原因堅持​​塊,除非/直到你能證明你需要特定的鎖的功能 - 因爲他們不能不被釋放。 (在你的情況下,我敢肯定,你需要單獨的讀/寫鎖,我正在做一個更一般的點這裏)。

0

您必須使用使用「明確鎖定」當一個try-finally塊,釋放你獲得的任何鎖定。

這是使用同步之間的關鍵區別。