java 死鎖現象及解決方法

2021-08-10 05:49:16 字數 1782 閱讀 5295

摘自:
所謂死鎖:是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的資源而無法繼續執行,這就產生了一種特殊現象死鎖。

雖然程序在執行過程中,可能發生死鎖,但死鎖的發生也必須具備一定的條件,死鎖的發生必須具備以下四個必要條件。

1)互斥條件:指程序對所分配到的資源進行排它性使用,即在一段時間內某資源只由乙個程序占用。如果此時還有其它程序請求資源,則請求者只能等待,直至占有資源的程序用畢釋放。

2)請求和保持條件:指程序已經保持至少乙個資源,但又提出了新的資源請求,而該資源已被其它程序占有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。

3)不剝奪條件:指程序已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。

4)環路等待條件:指在發生死鎖時,必然存在乙個程序——資源的環形鏈,即程序集合中的p0正在等待乙個p1占用的資源;p1正在等待p2占用的資源,……,pn正在等待已被p0占用的資源。

在系統中已經出現死鎖後,應該及時檢測到死鎖的發生,並採取適當的措施來解除死鎖。目前處理死鎖的方法可歸結為以下四種:

1) 預防死鎖。

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

2) 避免死鎖。

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

3)檢測死鎖。

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

4)解除死鎖。

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

package com.thread.demo1;

public

class deadtest

}

package com.thread.demo1;

public

class

deadlock

implements

runnable}}

else }}

i++;}}

}``

package com.thread.demo1;

public class locka

public static final locka locka = new locka();

}

package com.thread.demo1;

public class lockb

public static final lockb lockb = new lockb();

}

死鎖現象及解決方法

死鎖現象 過多的同步可能造成相互不釋放資源 先定義兩個類,乙個口紅,乙個鏡子 class lipstick class mirror 化妝類 g0在鎖lipstick後又想鎖住mirror,g1在鎖住mirror後又想鎖住lipstick,當兩個同時都想擁有對方的鎖的時候,就會出現死鎖的現象。pub...

死鎖及解決方法

死鎖的概念 quad 死鎖 指的是 quad 多個執行緒各自占有一些共享資源,並且互相等待其他執行緒占有的資源才能進行,而導致兩個或者多個執行緒都在等待對方釋放資源,都停止執行的情形。quad 因此,某乙個同步塊需要同時擁有 兩個以上物件的鎖 時,就可能會發生 死鎖 的問題。下面案例中,化妝執行緒 ...

Java併發程式設計 死鎖及解決方法

死鎖是多個程序 執行緒為了完成任務申請多個不可剝奪的資源並且以不正確的方式推進導致的一直互相等待對方釋放資源的狀態。下面以經典的哲學家就餐問題為例,描述死鎖產生的場景。五個哲學家坐在乙個圓桌上,每個哲學家兩側都放著1根筷子,總共有5只筷子。哲學家需要分別或者左右手的兩隻筷子才能就餐,就餐完成後將筷子...