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

死鎖:通常狀況下,若是同一個線程前後兩次調用lock,在第一次調用時,因爲鎖已經被佔用,該線程會掛起等待別的線程釋放鎖,然而鎖正是被本身佔用着的,該線程又被掛起而沒有機會釋放鎖,所以 就永遠處於掛起等待狀態了,這叫作死鎖(Deadlock)。 另外一種典型的死鎖情形是這樣:線程A獲 得了鎖1,線程B得到了鎖2,這時線程A調lock試圖得到鎖2,結果是須要掛起等待線程B釋放 鎖2,這時線程B也調用lock試圖得到鎖1,結果是須要掛起等待線程A釋放鎖1,因而線程A和B都 永遠處於掛起狀態了。算法

產生的條件:ide

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

請求與保持條件(Hold and wait):已經獲得資源的進程能夠再次申請新的資源。線程

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

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

如何避免:it

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

2.檢測死鎖而且恢復。class

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

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

相關文章
相關標籤/搜索