像Java這類語言,寫多線程是很常常的事情,可是在多線程中,可以保證在不一樣環境中都不死鎖是很是不容易的。沒有一種方法可以保證不死鎖,可是一些設計模式和建議對此多是有用的。 java
一、文檔線程模型 設計模式
二、Java Monitors中的陷阱 多線程
設計Monitors模型時沒有繼承機制。而Java有繼承機制,Java的多線程用的是Monitors模型,所以當父類某處用了同步鎖,而子類不知道,子類也用了同步鎖,就變成了死鎖。 線程
爲了解決這個問題,對於公開的API的類,不能將其對外方法聲明爲同步。不讓別人知道你的API中哪裏使用了同步。由於用戶也許仍然會相信Java的同步是基於Monitor機制的,因此他們能夠隨意向Java類中添加本身的同步方法。能避免這種狀況的惟一辦法是提供下面代碼所示的內部鎖,固然使用java.util.concurrent包中提供的相似的鎖功能也是能夠的。 設計
三、觸發死鎖的條件 繼承
知足如下4個條件,會觸發死鎖: 資源
1)互斥條件,只有一個線程能訪問某個資源 開發
2)無優先級調度,一個資源被佔用,沒有辦法強行釋放該資源 文檔
3)持有和等待條件,即無限期地持有或者等待某個資源 同步
4)能夠獲取多個資源
只要破壞上述條件中的某一個,死鎖就被破壞。可是這不是容易的,迄今爲止,還未找到某個靜態的方法,可以檢測出存在死鎖的狀況。
基本的建議對於開發人員是:使用外部代碼時,不要採用鎖。