爲避免死鎖,有人應遵循哪些最佳實踐/成語?避免多線程進程中的死鎖
回答
爲避免死鎖的典型技術是有鎖的層次結構。確保所有線程以相同的順序獲取鎖或其他資源。這可以避免線程1持有鎖A並需要鎖B,而線程2持有鎖B並需要鎖A的死鎖情形。對於鎖層次結構,兩個線程都必須以相同的順序獲取鎖(例如,B之前的A) 。
所謂的Banker's algorithm,爲了避免死鎖。你也可以考慮使用Watch Dog以打破形式僵局。 Here也很少有趣的一點。
爲什麼沒有Upvote這個本質! – 8090PZ 2014-11-16 21:28:51
最好的做法是爲你的線程定義一個類,並且只在你的線程中使用這個類的非靜態字段,這樣你的線程就不會共享任何內存。
當然,爲避免死鎖,您還可以避免使用信號量,臨界區和互斥量。如果你想避免死鎖,則越少越好。不幸的是,如果某些內存或其他資源在兩個線程之間共享,則可能需要這些資源,否則可能會導致數據損壞。
有four conditions發生必須發生死鎖:
互斥條件:不能由多個進程同時
保留使用,並等待條件的資源:流程已經持有的資源可以請求新的資源
無搶佔條件:沒有資源可以從過程拿着它強行拆除,資源只能由電子發佈該方法的xplicit動作
循環等待條件:兩個或多個進程形成,其中每個處理等待,在鏈中的下一個進程持有
避免它們中的至少一個的資源的循環鏈,最好是更多,而且你不應該有太多問題。
在進入關鍵部分的各種方法中 - 信號量和互斥量是最受歡迎的。
旗號是等待機構和互斥鎖定機制,以及這個概念是混亂的最大,但總之,一個線程激活一個互斥體只能將其停用。考慮到這一點......
不要讓任何進程鎖定資源的部分沒有,如果一個進程需要5個資源,等到所有的都可以。
- 如果你在這裏使用信號量,你可以解鎖/取消等待其他線程佔用的資源。通過這個我的意思是先佔是另一個原因。
這2個根據我是基本情況,其餘2個常見的4個注意事項都可以與這些有關。
如果你不同意ps添加評論。我已經遲到了,我會在稍後添加一個更清晰和更清晰的解釋。
- 1. 避免死鎖 - 過程
- 2. 使用超時避免Java多線程中的死鎖
- 3. 多線程中的死鎖
- 4. 多線程死鎖
- 5. 避免螺旋鎖死鎖
- 6. 多線程和死鎖
- 7. 需要避免沒有通信的子進程死鎖
- 8. 合作/非搶先式線程避免死鎖?
- 9. Java中的多線程死鎖
- 10. Java中的多線程死鎖
- 11. 搶先避免死鎖
- 12. 避免死鎖示例
- 13. 避免死鎖MySQL/UniDAC/Delphi
- 14. 如何避免mysql死鎖?
- 15. Ruby線程死鎖
- 16. C#線程死鎖
- 17. C++線程死鎖
- 18. Python線程死鎖
- 19. Delphi線程死鎖
- 20. Java,線程死鎖?
- 21. Java線程死鎖
- 22. 單進程死鎖 - ?
- 23. 如何避免這個golang程序中的死鎖?
- 24. 存儲過程中避免死鎖的併發語句
- 25. 尋找多線程死鎖的原因?
- 26. 如何避免JSP中的多線程?
- 27. 死鎖的線程java
- 28. 如何在.NET中避免死鎖
- 29. 如何避免死鎖而多發的過程中SQL對同桌工作
- 30. SQL Server插入多個線程死鎖
[死鎖的常見原因是什麼?]可能的重複(http://stackoverflow.com/questions/528303/what-are-common-reasons-for-deadlocks) – 2017-03-21 11:19:01