如果線程持有ReentrantReadWriteLock.writeLock()停止執行,由於未捕獲到異常,被鎖釋放,抑或是舉行,現在所有的其他線程死鎖?會發生什麼?
Q
會發生什麼?
1
A
回答
3
我假設通過「失敗」,你的意思是一個未捕獲的異常傳播離開線程的頂端run
方法,導致它停止執行。
如果線程使用finally
正確阻塞,那麼它將在備份堆棧的過程中解鎖writeLock
。
但是,如果線程沒有調用unlock()
,它仍然保持該監視器,即使它不再運行 - 所以是的,其他線程將會死鎖。
這就是爲什麼它是獲取和正確釋放資源的關鍵重要。而且也是一個原因堅持塊,除非/直到你能證明你需要特定的鎖的功能 - 因爲他們不能不被釋放。 (在你的情況下,我敢肯定,你需要單獨的讀/寫鎖,我正在做一個更一般的點這裏)。
0
您必須使用使用「明確鎖定」當一個try-finally塊,釋放你獲得的任何鎖定。
這是使用同步之間的關鍵區別。
相關問題
- 1. 會發生什麼?
- 2. 會發生什麼?
- 3. 會發生什麼?
- 4. 會發生什麼?
- 5. 會發生什麼?
- 6. 發生故障時會發生什麼?
- 7. onDestroy()後會發生什麼
- 8. BeginProcessRequest()會發生什麼?
- 9. Office VBA會發生什麼?
- 10. Form.Close後會發生什麼?
- 11. System.Data.SqlClient.SqlTransaction.Dispose中會發生什麼?
- 12. 什麼時候會發生?
- 13. EntityManager.persist()後會發生什麼
- 14. 更新會發生什麼?
- 15. netdev_open後會發生什麼?
- 16. 會發生什麼成員
- 17. gcc -g:會發生什麼
- 18. CAN會發生什麼?
- 19. 爲什麼會發生? java
- 20. * ngFor後會發生什麼?
- 21. FileStream.copyTo(Net.ConnectStream)實習生會發生什麼?
- 22. iPhone開發計劃:會發生什麼?
- 23. 加載腳本時會發生什麼
- 24. 爲什麼會發生這種異常?
- 25. 當localStorage已滿時會發生什麼?
- 26. 當redis重載時會發生什麼?
- 27. 爲什麼會發生溢出?
- 28. 爲什麼我會發生衝突?
- 29. perl腳本結束會發生什麼?
- 30. 當我ping 127.0.0.1時會發生什麼