下面是乙個多執行緒死鎖的例子
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 ...