java產生死鎖的原因以及如何處理死鎖

所謂死鎖,就是指兩個或兩個以上的線程/進程在執行的過程中,因爭奪資源而造成的一種相互等到的現象,如果沒有外力作用,他們將無法進行下去。

1、導致死鎖的原因

產生死鎖的可能原因有:

1、系統資源不足

2、資源分配不當

3、進程/線程運行推進的順序不合適

產生死鎖的四個必要條件:

1、互斥條件,指分配的資源進行排他性使用,即在一定的時間內該資源只能被一個進程/線程佔用,如果此時還有其他進程/線程請求該資源,則只能等待,直到該資源佔用着自己使用完成後釋放。

2、請求與保持條件,指進程/線程已經獲得了資源,又提出了新的資源請求,而這個資源已經被 其他進程/線程佔有,此時請求進程/線程阻塞,但自己之前已經獲得的資源繼續保持佔有。

3、不可剝奪條件,指進程/線程已經獲得資源,在沒有使用完成之前,不能被搶佔剝奪,只能使用完成後自己釋放。

4、循環等待條件,指發生死鎖時,必然存在一個資源佔用鏈,即P1等待P2正在佔用的資源,P2等待P3正在佔用的資源...Pn等待P1正在佔用的資源.

2、死鎖的處理

1) 預防死鎖。 

  這是一種較簡單和直觀的事先預防的方法。方法是通過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被廣泛使用。但是由於所施加的限制條件往往太嚴格,可能會導致系統資源利用率和系統吞吐量降低。 

2) 避免死鎖。 

  該方法同樣是屬於事先預防的策略,但它並不須事先採取各種限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。 

3)檢測死鎖。 

  這種方法並不須事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在運行過程中發生死鎖。但可通過系統所設置的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的進程和資源,然後採取適當措施,從系統中將已發生的死鎖清除掉。 

4)解除死鎖。 

  這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將進程從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的進程,使之轉爲就緒狀態,以繼續運行。死鎖的檢測和解除措施,有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。 

 

 

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