執行過程中,多個程序因爭奪資源而造成的一種互相等待的僵局。
具體來說,某個任務在等待另乙個任務,而後者又等待別的任務,這樣一直下去,直到這個鏈條上的任務又在等待第乙個任務釋放鎖。這導致了乙個任務之間相互等待的連續迴圈,沒有哪個執行緒能繼續。這被稱之為死鎖。
死鎖產生的四個必要條件:
1、互斥條件:乙個資源每次只能被乙個程序使用。
2、請求和保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。
3、不可剝奪條件:程序已獲得的資源,在未使用完之前,不能強行剝奪。
4、迴圈條件等待:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
要解決死鎖問題,就必須打破上面四個條件的其中之一。在程式中,最容易打破的往往是第四個條件。
1、預防死鎖:設定某些限制條件,以破壞產生死鎖的4個必要條件,以防發生死鎖。
(該方法最容易實現,但是***就是使系統資源利用率比較低,嚴重損害系統效能)
2、避免死鎖:資源動態分配時,防止系統進入不安全狀態(可能產生死鎖的狀態),以避免發生死鎖。
(該方法要求較多的資料結構,實現起來困難,但是資源利用率最高)
3、檢測死鎖
4、解除死鎖
注:使用銀行家演算法避免死鎖
所謂銀行家演算法,是指在分配資源之前先看清楚,資源分配後是否會導致系統死鎖。如果會死鎖,則不分配,否則就分配。
1、確保所有的執行緒都是按照相同的順序獲得鎖,那麼死鎖就不會發生。
2、在嘗試獲取鎖的時候加乙個超時時間,這也就意味著在嘗試獲取鎖的過程中若超過了這個時限該執行緒則放棄對鎖的請求。若乙個執行緒沒有在給定的時限內獲得所有需要的鎖,則會進行回退並釋放掉所有已獲得的鎖,然後等待一段隨機的時間再重試。
3、死鎖檢測是乙個更好的死鎖預防機制,它主要是針對那些不可能實現按序加鎖並且鎖超時也不可行的場景。
1、資源剝奪法:掛起某些死鎖程序,並搶占它們的資源,將這些資源分配給其他的死鎖程序。
2、撤銷程序法:強制撤銷部分、甚至全部死鎖程序,剝奪這些程序的資源(按程序優先順序和撤銷程序代價的高低進行)。
3、程序回退法:讓乙個(多個)程序回退到足以避免死鎖的地步。
Java學習手冊 RandomAccessFile
1 方式 1 randomaccessfile提供了乙個可以從檔案中讀取位元組的方法 int read 該方法會從檔案中讀取乙個byte 8位 填充到int的低八位,高24位為0,返回值範圍正數0 255,如果返回 1表示讀取到了檔案末尾。每次讀取後自動移動檔案指標,準備下次讀取。2 randoma...
java學習筆記88 死鎖
在程式中是不允許出現死鎖情況,一旦發生那麼只能手動停止jvm的執行,然後查詢並修改產生死鎖的問題 簡單的描述死鎖就是 倆個執行緒t1和t2,t1拿著t2需要等待的鎖不釋放,而t2又拿著t1需要等待的鎖不釋放。注 可以通過jconsole檢視到執行緒死鎖的情況 例如 public class thre...
java死鎖例項
在實際程式設計中,要盡量避免出現死鎖的情況,但是讓你故意寫乙個死鎖的程式時似乎也不太簡單,以下是乙個簡單的死鎖例子。package dhp.test1 author 鄧海波 當類的物件flag 1時 t1 先鎖定o1,睡眠500毫秒,然後鎖定o2 而t1在睡眠的時候另乙個flag 0的物件 t2 執...