1、什麼是死鎖
1.1:死鎖定義:
死鎖是指兩個或兩個以上的執行緒在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。
1.2:死鎖產生條件:
1)互斥條件:某個資源某一時刻只能由乙個執行緒占用
2)不可搶占條件:資源申請者不能從資源佔有者手中搶奪資源
3)占有且申請:執行緒至少已經占有乙個資源,但又去申請新的資源,新資源被占用,該執行緒會阻塞
4)迴圈等待:乙個執行緒等待另外乙個執行緒釋放資源,另外乙個執行緒又去等待,直到最後乙個執行緒等待第乙個執行緒釋放資源,使得大家都被鎖住
2、常見死鎖
2.1:交叉鎖
若執行緒a訪問r1(獲得鎖r1),後訪問r2,同時執行緒b訪問r2(獲得鎖r2),後訪問r1;
因r1、r2被鎖,執行緒a 、b無法繼續,產生死鎖
private
final object r1 =
newobject()
;private
final object r2 =
newobject()
;//執行緒a
public
void
func1()
}}//執行緒b
public
void
func2()
}}
.2:記憶體不足2.3:一問一答的資料交換
在網路中,伺服器端(server)等待客戶端(client)的訪問,client傳送請求到server中,需要等待接收資料,若因為網路原因,server錯過client的請求,server和client就會一直等待,產生死鎖。
2.4:死迴圈引起的死鎖
如下列**,本身本身死迴圈,但在這個迴圈中,使用了一些開源的東西,呼叫層次比較深,就有可能出現死鎖問題
private
static hashmap
map =
newhashmap
<
>()
;for
(int i=
0; i<
2; i++)}
}.start()
;}
3、死鎖的避免、檢測
3.1:死鎖的預防
1)允許某些執行緒同時訪問某些資源
2)允許執行緒強行去奪取某些資源
3)允許實現資源預分配策略
4)執行緒按照編號申請資源
3.2:死鎖的避免
安全序列: 如果系統按照這種序列去分配資源,每個執行緒都能夠順序完成自己的需求,這樣序列就是安全序列,系統稱之為安全狀態。安全序列可能會有多個。
如果系統處於安全狀態,就一定不會發生死鎖;如果系統處於不安全狀態,就"可能"會發生死鎖。
4、哲學家就餐問題
問題:有5位哲學家圍在圓桌就餐,每個哲學家左邊旁邊只有一張筷子,若乙個哲學家進行思考,旁邊的人就會試圖獲得最靠近它的筷子,只有兩個筷子才能就餐,就餐完畢後,放下筷子進行思考。
chopstick
public
synchronized
void
getchopstick()
catch
(interruptedexception e)
} map.
put(leftchop,
true);
map.
put(rightchop,
true);
system.out.
println
("thread "
+curname+
" got the chopsticks "
+leftchop+
" and "
+rightchop);}
public
synchronized
void
freechopstick()
}public
class
testdemo8
catch
(interruptedexception e)
chopstick.
freechopstick()
;// }}}
.start()
;}}}
簡單的死鎖
package test1 乙個簡單的死鎖類 author istar 當類的物件flag 1時 t1 先鎖定o1,睡眠500毫秒,然後鎖定o2 而t1在睡眠的時候另乙個flag 0的物件 t2 執行緒啟動,先鎖定o2,睡眠500毫秒,等待t1釋放o1 t1睡眠結束後需要鎖定o2才能繼續執行,而此時...
死鎖的簡單總結
死鎖是指在一組程序中的各個程序均占有不會釋放的資源,但因互相申請被其他程序所站用不會釋放的資源而處於的一種永久等待狀態。一 死鎖產生的原因 1 因為系統資源不足,不能滿足程序的資源請求,會導致多個執行緒之間同時爭奪乙個資源。2 程序執行的順序不合適。3 資源分配不得當,有的程序分配的資源太少,會因為...
java 死鎖簡單理解
public class deadlock catch interruptedexception e synchronized resource2 thread thread2 new thread catch interruptedexception e synchronized resource...