天天看點

什麼條件下會産出死鎖,如何避免死鎖?

一個去美團面試的小夥伴私我說,被面試官問到一個死鎖的問題難道了,面試前還特意刷了題,面試的時候就是腦子一片空白不知道怎麼回答。今天,我給大家徹底講明白。

1、什麼是死鎖?

到底什麼是死鎖呢?

什麼條件下會産出死鎖,如何避免死鎖?

什麼條件下會産出死鎖,如何避免死鎖?

死鎖,簡單來說就是兩個或者兩個以上的線程在執行過程中,去争奪同一個共享資源導緻互相等待的現象。如果沒有外部幹預,線程會一直處于阻塞狀态,無法往下執行。這樣一直等待處于阻塞狀态的線程,被稱為死鎖線程。

2、産生死鎖的原因

産生死鎖需要同時滿足以下四個條件:

什麼條件下會産出死鎖,如何避免死鎖?

什麼條件下會産出死鎖,如何避免死鎖?

第一個:互斥條件,共享資源a和b隻能被一個線程占用;

第二個:請求和保持條件,線程T1已經擷取共享資源a,在等待共享資源b的時候,不釋放共享資源a;

第三個:不可搶占條件,其他線程不能強行搶占線程T1占有的資源;

第四個:循環等待條件,線程T1等待線程T2占有的資源,線程T2等待線程T1占有的資源,這形成了循環等待。

3、如何避免死鎖?

線程産生死鎖之後,隻能通過外部幹預來解決問題,比如重新開機程式,或者Kill線程。是以,我們隻能在寫代碼時規避死鎖的産生。那麼如何避免死鎖産生呢?根據産生死鎖的四個必要條件,我們隻需要破壞其中任何一 個條件就可以解決。

什麼條件下會産出死鎖,如何避免死鎖?

什麼條件下會産出死鎖,如何避免死鎖?

第一個互斥條件是沒有辦法被破壞的,因為它是互斥鎖的基本限制。其他三個條件都可以通過人工幹預來破壞。比如請求保持條件,我們可以在首次執行一次性申請所有的資源,這樣就不存在等待鎖的問題了。

第二個,對于不可搶占條件來說,占用部分資源的線程在進一步申請其他資源的時候如果申請不到,我們可以主動釋放它占有的資源。這樣不可搶占這個條件就被破壞了。

第三個,對于循環等待條件來說,可以通過按序申請資源來預防死鎖的産生。所謂按序申請,就是給資源編号,所有線程可以按照線性化的序号順序去申請共享資源,先申請需要序号小的,再申請序号大的,這樣循環等待自然就不存在了。

以上就是我對死鎖的了解,聽懂了的小夥伴,請關注點個贊,下次不迷路。

S信【Tom】或【666】即可免費領取需要更多幹貨内容,還有海量面試資料,隻彈幹貨不慘水!

繼續閱讀