Java死鎖與如何避免死鎖

所謂死鎖就是進程循環等待它方佔有的資源而無限制的僵持下去的局面。

以一個簡單的例子來解釋:一個橋,最多可以通過一個車子,但是左右兩邊都來了車子,而且都上了橋,左邊的車子,佔用了左邊的橋資源,二右邊的車子,佔用了右邊的橋的資源。左邊的車子等待右邊的車子讓出右邊的資源,但是右邊的車子卻要左邊的車子讓出左邊的資源。雙方都不放棄自己所佔有的資源,卻都想着讓對方讓出自己的資源,這就會無限制的等待下去。上述的車子表示進程,橋面代表着資源,資源只能由一個進程佔有,不允許兩個進程同時佔有,結果兩個進程等不能繼續執行,如果不採取其他的措施,上述兩個進程的等待狀況會無限制的持續下去,這就是進程的死鎖。計算機系統產生死鎖的根本原因就是資源有限且操作不當。

產生死鎖的必要條件:

1.      互斥條件:就是一個資源同時只能有一個進程佔有,不能有兩個或是兩個以上的佔有。

2.      不可搶佔條件:在一個進程所獲取的資源在未使用完畢之前,資源申請者不能強行的從資源佔有者手中搶奪資源。

3.      佔有申請條件:進程已經佔有了一個資源,但是有申請新的資源;但是新申請的資源已經被別的進程佔有了,此時該進程就會阻塞,但是在獲取申請的資源之前他還會一直佔有已佔有的那個資源。

4.      循環等待條件:存在一個循環等待序列,p1等待p2,p2等待p3,p3等待p1。形成一個進程循環等待。

上述四個條件在死鎖是會同時發送,也就是隻要一個必要條件不通過,則就不會產生死鎖。

 

如何避免死鎖:

(1)    打破互斥條件:允許進程同時訪問某些資源,但是,有的資源不允許被同時訪問,就像打印機,這是由資源的本身來決定的,所以這個方法並沒有什麼實用的價值。

(2)    打破不可搶佔的條件:就是說允許進程強行從資源的佔有者那裏搶奪資源。這種方法實現起來很困難,會降低性能。

(3)    打破佔有申請條件:可以實現資源預先分配策略,在進程運行前一次性向系統申請他所需要的全部資源。如果進程所需的資源不能滿足,則不分配任何資源,進程暫時不運行。(問題:1.在很多時候,一個進程在執行之前不可能知道它所有的全部資源,進程在執行的過程中,是動態的。2.資源利用率低。3.降低進程的併發性,因爲資源有效,有加上存在浪費,能分配的所需全部資源的進程個數必然很少。)

(4)    打破循環等待條件:實行資源的有序分配策略,把資源事先分類編號,按號分配,使進程在申請,佔用資源時候不能形成環路,所有進程對資源的請求必須嚴格按照資源號遞增的順序提出,進程佔用了小號的資源,才能申請大號資源。就會形成環路。(缺點:限制進程對資源的請求,同時對系統中的所有資源合理編號也是很有困難的,增加額外的系統開銷。)

 

上述的是排除死鎖的靜態策略,下面可以介紹排除死鎖的動態策略。

常見的有銀行家算法可以避免死鎖
發佈了54 篇原創文章 · 獲贊 70 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章