[size=x-large]死鎖[/size]
[size=medium]1、何為死鎖[/size]
簡單說來,死鎖就是系統中的執行緒因相互等侍彼此占有的資源而暫停執行,造成系統假死的現象。
[size=medium]2、死鎖是如何發生的[/size]
假設系統有兩個互斥資源a和b,系統中的兩個執行緒1和2都要獲得a和b之後才能正常工作, 但是執行緒1先取資源a再取資源b,執行緒2先取資源b再取資源a。這樣就有可能發生這樣的情況:執行緒1先申請了資源a,再準備申請資源b的時候,由於處理器排程,執行緒2開始執行;執行緒2申請了資源b,在準備取資源a的時候發現資源a已經被別的執行緒(1)占用了,這樣執行緒2暫停執行;當執行緒1接著執行時,發現資源b已經被別的執行緒(2)占用了。就這樣,執行緒1和2相互等待彼此占有的資源而一直停止下去,造成了系統假死的現象。
[size=medium]3、乙個死鎖的例子[/size]
下面這個例子簡單了模擬了上面的死鎖現象:
public class resource
public synchronized void drop()
public static void main(string args) throws ioexception
}class mythread implements runnable
@override
public void run()
}catch (interruptedexception e)
}}
[size=medium]4、死鎖發生的必要條件[/size]
死鎖的發生需要滿足四個必要條件:
[list]
[*][b]互斥條件[/b]:指程序對所分配到的資源進行排它性使用,即在一段時間內某資源只由乙個程序占用。如果此時還有其它程序請求資源,則請求者只能等待,直至占有資源的程序用畢釋放。
[*][b]請求和保持條件[/b]:指程序已經保持至少乙個資源,但又提出了新的資源請求,而該資源已被其它程序占有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。
[*][b]不剝奪條件[/b]:指程序已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
[*][b]迴圈等待條件[/b]:指在發生死鎖時,必然存在乙個程序——資源的環形鏈,即程序集合中的p0正在等待乙個p1占用的資源;p1正在等待p2占用的資源,……,pn正在等待已被p0占用的資源。
[/list]
[size=medium]5、解決死鎖[/size]
死鎖只有在四個必要條件都滿足的情況下才可能發生,因此,只需要破壞其中乙個就可以防止死鎖的發生了。
上面的例子中,最容易破壞的就是第四個迴圈等待條件了,只要讓執行緒2也像執行緒1那樣,先申請資源a,再申請資源b就破壞了第四個條件,也就可以防止死鎖的產生了。為止,只需要簡單修改上例的main()方法即可:
public static void main(string args) throws ioexception
java多執行緒學習 四
本篇介紹synchronized 非this物件x 方式的同步,x一般是引數或者例項變數 package chapter2.synblockstring3 演示不同執行緒持有不同的物件監視器,呼叫是非同步的 ta的物件監視器是anystring,而b的物件監視器是類例項物件 a begin b be...
java多執行緒學習四 後台執行緒
package myk 使用thread建立的執行緒預設情況下是前台執行緒,在程序中,只要有乙個前台執行緒未退出,程序就不會終止。主線程就是乙個前台執行緒。而後台執行緒不管執行緒是否結束,只要所有的前台執行緒都退出 包括正常退出和異常退出 後,程序就會自動終止。一般後台執行緒用於處理時間較短的任務,...
Java多執行緒(四) 協調同步執行緒
當乙個執行緒使用的同步方法中用到的某個變數,而此變數又需要其他執行緒修改才能符合本執行緒的需要,那麼可以再同步方法中使用wait 方法。使用wait 方法時正確的模板是將鎖放置在while 迴圈中。package test public class tickethome implements run...