JAVA多執行緒機制之死鎖

2021-09-23 23:19:19 字數 1156 閱讀 8800

同步特性使用起來非常方便,功能很強大。但有的時候考慮不周的話有可能出現執行緒死鎖。死鎖主要是多個執行緒爭搶資源造成的。

下面通過乙個例子演示死鎖:

class resource

public

void

setres(int res)

}class deadlock1 extends thread

@override

public

void

run()

system.out.println(getname() + ":資源1處理完畢等待資源2...");

trycatch (interruptedexception e)

// 此時res1並未釋放

// 獲取res2的鎖從而鎖住res2

synchronized (res2)

system.out.println(getname() + ":資源2處理完畢...");}}

}}class deadlock2 extends thread

@override

public

void

run()

system.out.println(getname() + ":資源2處理完畢等待資源1...");

trycatch (interruptedexception e)

// 此時res2並未釋放

// 獲取res1的鎖從而鎖住res1

synchronized (res1)

system.out.println(getname() + ":資源1處理完畢...");}}

}}public

class

deadlockdemo

}

執行結果:

執行緒1:資源1處理完畢等待資源2…

執行緒2:資源2處理完畢等待資源1…

程式說明:執行緒1和執行緒2共享資源res1和res2,當執行緒1首先執行獲取資源res1的鎖從而鎖住res1,呼叫sleep()使執行緒2得以執行,此時資源res1還未釋放。執行緒2鎖住資源res2,呼叫sleep(),執行緒1執行,此時資源res2還未釋放,執行緒1嘗試獲取資源res2但是已經被執行緒2鎖住,執行緒2睡眠過後開始執行嘗試獲取資源res1的鎖但是已經被執行緒1鎖住。此時執行緒1和執行緒2處於死鎖狀態。

java多執行緒之 死鎖

當兩個或多個執行緒競爭試圖獲取對方持有的同步鎖時,它們都會處於阻塞狀態,除非某個執行緒主動釋放自己所持有的同步鎖,這時,死鎖就出現了。用下面這張圖很好理解 如圖,執行緒thread1和thread2都有兩個同步方法operation1 operation2 operation1 中會呼叫operat...

Java 多執行緒之死鎖

大家可能平時玩電腦,可以同時掛qq啊,玩遊戲啊,開啟文字啊,等等。這裡,我們假設是單塊cpu。也就是俗稱的單核cpu。大家可能會覺得這些軟體,這些執行緒是同時執行的,其實不然,其實在任何一種情況下,電腦都只執行乙個執行緒!只是因為這個單塊的cpu內部為我們劃分了很多很多的時間塊,而這個時間的劃分是以...

多執行緒之死鎖

1 死鎖發生的場景 有時候兩個或者多個執行緒需要訪問同乙份資源,這裡就涉及到執行緒同步的問題 thread1 synchronized object1 thread2 synchronized object2 看看上面的例子,兩個執行緒各自都有想要訪問對方的想法,可是雙方都不願意放手,就像a拿到了開...