什麼是死鎖?產生的條件?如何避免?

死鎖:一般情況下,如果同一個線程先後兩次調用lock,在第一次調用時,由於鎖已經被佔用,該線程會掛起等待別的線程釋放鎖,然而鎖正是被自己佔用着的,該線程又被掛起而沒有機會釋放鎖,因此 就永遠處於掛起等待狀態了,這叫做死鎖(Deadlock)。 另一種典型的死鎖情形是這樣:線程A獲 得了鎖1,線程B獲得了鎖2,這時線程A調lock試圖獲得鎖2,結果是需要掛起等待線程B釋放 鎖2,這時線程B也調用lock試圖獲得鎖1,結果是需要掛起等待線程A釋放鎖1,於是線程A和B都 永遠處於掛起狀態了。

產生的條件:

互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。

請求與保持條件(Hold and wait):已經得到資源的進程可以再次申請新的資源。

非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。

循環等待條件(Circular wait):系統中若干進程組成環路,改環路中每個進程都在等待相鄰進程正佔用的資源。

如何避免:

1.忽略該問題。例如鴕鳥算法,該算法可以應用在極少發生死鎖的的情況下。爲什麼叫鴕鳥算法呢,因爲傳說中鴕鳥看到危險就把頭埋在地底下,可能鴕鳥覺得看不到危險也就沒危險了吧。跟掩耳盜鈴有點像。

2.檢測死鎖並且恢復。

3.仔細地對資源進行動態分配,以避免死鎖。

4.通過破除死鎖四個必要條件之一,來防止死鎖產生。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章