位置:首頁(yè) > 軟件操作教程 > 編程開發(fā) > Java > 問題詳情

Java操作應(yīng)用——避免死鎖

提問人:ylm發(fā)布時(shí)間:2020-09-29

死鎖出現(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í)。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部