Java操作應(yīng)用——避免死鎖
死鎖出現(xiàn)的原因有很多。避免死鎖不是一句話就能解決的。通常來說,當(dāng)某個同步對象在等待另一個同步對象所擁有的資源上的鎖時,便會產(chǎn)生死鎖。
試著運行下下面的程序。它會告訴你什么是死鎖。這個死鎖是由于兩個線程都在等待對方所擁有的資源,因此會產(chǎn)生死鎖。它們會一直等待,沒有誰會先放手。
運行結(jié)果:
Addition Thread: 13
Subtraction Thread: 7
Holding First Lock…
Holding Second Lock…
Addition Thread: Waiting for AddLock…
Subtraction Thread: Waiting for SubLock…
但如果調(diào)用的順序變一下的話,死鎖的問題就解決了。
將 MySubtractionThread中的線程加鎖順序調(diào)換再看看
運行結(jié)果:
Addition Thread: 13
Holding First Lock…
Addition Thread: Waiting for AddLock…
Threads: Holding Add and Sub Locks…
Subtraction Thread: 7
Holding Second Lock…
Subtraction Thread: Waiting for SubLock…
Threads: Holding Add and Sub Locks…
三種用于避免死鎖的技術(shù):
1>加鎖順序
2>加鎖時限
3>死鎖檢測
一個更好的方案是給這些線程設(shè)置優(yōu)先級,讓一個(或幾個)線程回退,剩下的線程就像沒發(fā)生死鎖一樣繼續(xù)保持著它們需要的鎖。如果賦予這些線程的優(yōu)先級是固定不變的,同一批線程總是會擁有更高的優(yōu)先級。為避免這個問題,可以在死鎖發(fā)生的時候設(shè)置隨機的優(yōu)先級。
點擊加載更多評論>>