Java死結舉例

來源:互聯網
上載者:User

標籤:多線程   死結   

死結:

    在多線程競爭使用共用資源的情況下,就有可能出現死結的情況。比如,當一個線程等待另一個線程所持有的鎖時,那個線程又可能在等待第一個線程所持有的鎖。此時,這兩個線程會陷入無休止的相互等待狀態,這種情況就稱為死結。

產生死結的四個必要條件:

1、互斥條件。進程對所分配的資源進行排它性控制,即在一段時間內某資源僅為一進程所佔有。

2、請求和保持條件。當進程因請求資源而阻塞時,對已獲得的資源保持不放。

3、不剝奪條件。進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。

4、環路等待條件。在發生死結時,必然存在一個進程-資源的環形鏈,即進程集合{P1,P2,。。。,Pn}中的P1等待一個P2佔用的資源,P2正在等待一個P3佔用的資源,。。。,Pn正在等待已被P1所佔用的資源。


比較簡單的解決死結的方法是通過設定某些限制條件,去破壞產生死結的四個必要條件中的一個或者幾個,來預防發生死結。預防死結是一種較易實現的方法,已被廣泛使用。但是由於所施加的限制條件往往太嚴格,可能會導致系統資源使用率和系統輸送量降低。

下面是產生死結的一個樣本:

package com.hh.deadLock;public class DeadLockDemo {public static void main(String[] args) {final Object resource1 = "資源1";final Object resource2 = "資源2";Thread t1 = new Thread(){public void run() {synchronized(resource1){System.out.println("線程1:擷取資源1使用權");try {Thread.sleep(500);} catch (Exception e) {}synchronized(resource2){System.out.println("線程1:等待資源2");}}}};Thread t2 = new Thread(){public void run() {synchronized(resource2){System.out.println("線程2:擷取資源2使用權");try {Thread.sleep(500);} catch (Exception e) {}synchronized(resource1){System.out.println("線程2:等待資源1");}}}};t1.start();t2.start();}}

程式會先列印出

線程1:擷取資源1使用權線程2:擷取資源2使用權
或者是

線程2:擷取資源2使用權線程1:擷取資源1使用權
然後程式就不再往下執行

線程t1擷取“資源1”使用權後等待“資源2”,而線程t2擷取“資源2”使用權後等待“資源1”,這樣,線程t1和線程t2就引起了死結。

如果將程式中的Thread.sleep(500);這行代碼注釋,則程式可能引起死結,也可能不引起。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.