Java操作應(yīng)用——避免死鎖
死鎖出現(xiàn)的原因有很多。避免死鎖不是一句話就能解決的。通常來說,當(dāng)某個(gè)同步對(duì)象在等待另一個(gè)同步對(duì)象所擁有的資源上的鎖時(shí),便會(huì)產(chǎn)生死鎖。
試著運(yùn)行下下面的程序。它會(huì)告訴你什么是死鎖。這個(gè)死鎖是由于兩個(gè)線程都在等待對(duì)方所擁有的資源,因此會(huì)產(chǎn)生死鎖。它們會(huì)一直等待,沒有誰會(huì)先放手。
運(yù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)換再看看
運(yùn)行結(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>加鎖時(shí)限
3>死鎖檢測(cè)
一個(gè)更好的方案是給這些線程設(shè)置優(yōu)先級(jí),讓一個(gè)(或幾個(gè))線程回退,剩下的線程就像沒發(fā)生死鎖一樣繼續(xù)保持著它們需要的鎖。如果賦予這些線程的優(yōu)先級(jí)是固定不變的,同一批線程總是會(huì)擁有更高的優(yōu)先級(jí)。為避免這個(gè)問題,可以在死鎖發(fā)生的時(shí)候設(shè)置隨機(jī)的優(yōu)先級(jí)。
點(diǎn)擊加載更多評(píng)論>>