一、死鎖定義
1、生活中的列子
兩人吃飯,但只有一雙筷子,
2人輪流吃(同時擁有2只筷子才能吃),
某個時候一人拿了左筷子,一人拿了右筷子,兩人同時占用一個資源,等待另一個資源,
這時候甲等乙吃完并釋放他所占的筷子,而乙同樣等待甲吃完并釋放他所占有的筷子,這樣就陷入了一個死循環,誰也無法繼續吃飯。這就是死鎖
2、定義
指多線程因競爭資源而造成的一種僵局(互相等待)若無外力作用這些進程都將無法向前推進 。
二、死鎖產生的原因
1、系統資源的競爭
這里寫圖片描述
2、請求和釋放資源的順序不當
進程在運行過程中,請求和釋放資源的順序不當,也會導致死鎖。
例如,并發進程 P1、P2分別保持了資源R1、R2,而進程P1申請資源R2,進程P2申請資源R1時,兩者都 會因為所需資源被占用而阻塞。
3、進程間相互等待
信號量使用不當也會造成死鎖。進程間彼此相互等待對方發來的消息,結果也會使得這 些進程間無法繼續向前推進。例如,進程A等待進程B發的消息,進程B又在等待進程A 發的消息,可以看出進程A和B不是因為競爭同一資源,而是在等待對方的資源導致死鎖。
三、死鎖產生的必要條件
這里寫圖片描述
四、如何避免死鎖
1、給線程按一定的順序加鎖
2、嘗試在獲取鎖的時候加超時時間
嘗試獲取鎖的過程中若超過了這個時限該線程則放棄對該鎖請求。若一個線程沒有在給定的時限內成功獲得所有需要的鎖,則會進行回退并釋放所有已經獲得的鎖,然后等待一段隨機的時間再重試。這段隨機的等待時間讓其它線程有機會嘗試獲取相同的這些鎖,并且讓該應用在沒有獲得鎖的時候可以繼續運行(譯者注:加鎖超時后可以先繼續運行干點其它事情,再回頭來重復之前加鎖的邏輯)。
3、死鎖檢測
上面兩種情況不使時候就用這就可以了~~~~
看完點贊,養成習慣,微信搜一搜「 程序猿養成中心 」關注這個喜歡寫干貨的程序員。
另外更有Android一線大廠面試完整考點、資料更新在我的Gitee,有面試需要的朋友們可以去參考參考,如果對你有幫助,可以點個Star哦!
Gitee地址:【老陳的Gitee】