Java 教程
死鎖是這樣一種情形:多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止。
java 死鎖產(chǎn)生的四個必要條件:
當(dāng)上述四個條件都成立的時候,便形成死鎖。當(dāng)然,死鎖的情況下如果打破上述任何一個條件,便可讓死鎖消失。下面用java代碼來模擬一下死鎖的產(chǎn)生。
解決死鎖問題的方法是:一種是用synchronized,一種是用Lock顯式鎖實現(xiàn)。
而如果不恰當(dāng)?shù)氖褂昧随i,且出現(xiàn)同時要鎖多個對象時,會出現(xiàn)死鎖情況,如下:
以上代碼運行輸出結(jié)果為:
Tue May 05 10:51:06 CST 2015 LockB 開始執(zhí)行 Tue May 05 10:51:06 CST 2015 LockA 開始執(zhí)行 Tue May 05 10:51:06 CST 2015 LockB 鎖住 obj2 Tue May 05 10:51:06 CST 2015 LockA 鎖住 obj1
此時死鎖產(chǎn)生。
為了解決這個問題,我們不使用顯示的去鎖,我們用信號量去控制。
信號量可以控制資源能被多少線程訪問,這里我們指定只能被一個線程訪問,就做到了類似鎖住。而信號量可以指定去獲取的超時時間,我們可以根據(jù)這個超時時間,去做一個額外處理。
對于無法成功獲取的情況,一般就是重復(fù)嘗試,或指定嘗試的次數(shù),也可以馬上退出。
來看下如下代碼:
以上實例代碼輸出結(jié)構(gòu)為:
Tue May 05 10:59:13 CST 2015 LockA 開始執(zhí)行 Tue May 05 10:59:13 CST 2015 LockB 開始執(zhí)行 Tue May 05 10:59:13 CST 2015 LockB 鎖住 obj2 Tue May 05 10:59:13 CST 2015 LockA 鎖住 obj1 Tue May 05 10:59:14 CST 2015LockB 鎖 obj1 失敗 Tue May 05 10:59:14 CST 2015LockA 鎖 obj2 失敗 Tue May 05 10:59:15 CST 2015 LockA 鎖住 obj1 Tue May 05 10:59:15 CST 2015 LockA 鎖住 obj2其他擴展