Java多執行緒 手寫乙個死鎖的例子

2021-09-19 08:06:33 字數 975 閱讀 4735

下面是乙個多執行緒死鎖的例子

public

class

deadlockdemo

private

void

deadlock()

catch

(interruptedexception e)

synchronized

(lock2)

} system.out.

println

("thread1 end");

}});

thread t2 =

newthread

(new

runnable()

catch

(interruptedexception e)

synchronized

(lock1)

} system.out.

println

("thread2 end");

}});

t1.start()

; t2.

start()

;}}

執行結果:

thread1 get lock1

thread2 get lock2

// 後面無限期等待下去

兩個執行緒相互得到鎖1,鎖2,然後執行緒1等待執行緒2釋放鎖2,執行緒2等待執行緒1釋放鎖1,兩者各不相互,這樣形成死鎖。

那麼如何避免和解決死鎖問題呢?

1、按順序加鎖

上個例子執行緒間加鎖的順序各不一致,導致死鎖,如果每個執行緒都按同乙個的加鎖順序這樣就不會出現死鎖。

2、獲取鎖時限

每個獲取鎖的時候加上個時限,如果超過某個時間就放棄獲取鎖之類的。

3、死鎖檢測

按執行緒間獲取鎖的關係檢測線程間是否發生死鎖,如果發生死鎖就執行一定的策略,如終斷線程或回滾操作等。

乙個模擬死鎖的多執行緒

package org.kevinlifeng public class testdeadlock implements runnable catch interruptedexception e t1嘗試鎖o2 可o2 已經被t2 給鎖住了還沒釋放,一直等待 synchronized o2 到了這...

手寫多執行緒中的死鎖問題

在使用多執行緒時,有這麼一種情況 有兩個執行緒 執行緒a 執行緒b 有兩個物件鎖 locka lockb 當執行緒a想要去執行共享資料時,需要先獲取到locka物件鎖,再獲取到lockb物件鎖後,才可以去操作共享資料。當執行緒b想要去執行共享資料時,需要先獲取到lockb物件鎖,再獲取到locka物...

手寫乙個單例

在面試過程中,經常會碰見讓自己寫乙個單列,在這邊寫兩個僅供參考 第一種,也是最簡單的,使用靜態方法建立唯一的例項,餓漢式 public class demo 提供乙個獲取例項的靜態方法 public static user getusr public static void main string ...