事件的次序如下
首先thread 啟動並對theobject步阻止任何其他線程對theobject調用任何方法
然後thread i調用sleep()使thread可以啟動
thread啟動並對theOtherObject同步阻止任何其他線程對theOtherObject調用任何方法
然後thread用sleep()允許thread再次運行
threadl醒來並試著對theOtherObject用methord(}但必須等到對theOtherObject同步的thread中的代碼完全執行完後才可以調用
再次運行thread因為threadl不能繼續並試著調用theObject的method()直至thread 的代碼塊完成執行過程才能繼續threadl ()是與theObject同步的
任何線程不可能繼續進行杯去發生了死鎖發現並糾正這類問題非常困難特別是如果你的程序很復雜並且有將繼續執行的其他線程時
在最後的例子中通過對main()的for循環中對一個賬戶設置同步你也可以創建一個無價值的死鎖例如
synchronized accounts[]){
for(int i=;i<=transactionCount;i++)
{
//code for generating transactions etc
}
}
一但accounts[]出現一個交易死鎖就會發生因為在theBank對象中用於處理交易並由一個Clerk對象調用的doTransaction()方法將針對同一對象同步並直到循環結束才能執行當然直到theBank對象中的方法結束循環才能繼續所以程序掛起
通常確保你的程序沒有潛在的死鎖非常困難如果你打算用線程編寫大量程序你需要比我們這裡研究得更深入細致這個方面的一本好書是由Doug Lea編寫的<《java並行編程設計原理和模式》(ISON)
[] [] [] [] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27742.html