死結和synchronized的進一步研究

來源:互聯網
上載者:User

當synchronized使用過多時,可能會造成死結,那麼死結到底是怎麼一回事呢。先看下面的代碼,實現死結:

//死結的實現<br />class A<br />{<br />public void get(){<br />System.out.println("A說:我開始啟動了,B,給我你的資源");<br />}<br />public void say(){<br />System.out.println("A獲得資源");<br />}<br />}<br />class B<br />{<br />public void get(){<br />System.out.println("B說:我開始啟動了,A,給我你的資源");<br />}<br />public void say(){<br />System.out.println("B獲得資源");<br />}<br />}<br />class MyThread implements Runnable<br />{<br />public static A a = new A();<br />public static B b = new B();<br />public boolean flag = false;<br />public void run(){<br />if(flag){<br />synchronized(a){<br />a.get();<br />try{<br />Thread.sleep(500);<br />}catch(InterruptedException e){}</p><p>synchronized(b){ //此同步代碼塊在另一同步代碼塊裡<br />a.say();<br />}</p><p>}</p><p>}else{<br />synchronized(b){<br />b.get();<br />try{<br />Thread.sleep(500);<br />}catch(InterruptedException e){}</p><p>synchronized(a){ //此同步代碼塊在另一同步代碼塊裡</p><p>b.say();<br />}<br />}</p><p>}<br />}<br />}<br />public class Demo24<br />{<br />public static void main(String args[]){<br />MyThread mt1 = new MyThread();<br />MyThread mt2 = new MyThread();<br />mt1.flag=true;<br />mt2.flag=false;<br />Thread th1 = new Thread(mt1);<br />Thread th2 = new Thread(mt2);<br />th1.start();<br />th2.start();<br />}<br />}

 

以上代碼由於synchronized的同步造成了死結,死結是兩個或多個線程同時等待對方的完成,而程式無法繼續執行。在解釋代碼前,首先要明白synchronized到底是怎麼一回事。synchronized定義同步,那麼同步的什麼,什麼和什麼同步了?

首先,我們得知道,什麼是鎖。在java中,每一個對象都有一個內部鎖,如果以方法或代碼塊用synchronized進行聲明,那麼對象的鎖將保護整個方法或代碼塊,要調用這個方法或者執行這個代碼塊,必須獲得這個對象的鎖。而且,任何時候都只能有一個線程對象執行被保護的代碼

在以上代碼中,線上程th1啟動後,他就獲得了a的鎖,同時當其休眠完畢,求會申請獲得b的鎖,而此時,他的a鎖沒有放棄。

                     線上程th2啟動後,他就獲得了b的鎖,同時當其休眠完畢,求會申請獲得a的鎖,而此時,他的b鎖沒有放棄。

兩方都握有自己的鎖不放棄,而同時申請另一方的鎖,所以,此時就造成了死結。

同步,同步的就是線程和對象,將線程和對象進行綁定,擷取對象的鎖。

注意:通過以上代碼可以發現,死結的必要條件是不放棄已有的鎖,而同時申請新鎖。所以,要想實現死結,就會有synchronized的嵌套。

這樣才能同時操作兩個以上的鎖,從而造成死結。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.