【程式碼範例】 一個簡單的Java死結

來源:互聯網
上載者:User

標籤:線程 死結

       在實際編程中,要盡量避免死結情況的出現,但是有些面試中故意讓你寫一個死結的程式,這似乎也不太簡單(有些公司會出這樣的面試題),下面講解一個簡單的死結例子。

代碼說明:

第一步:當DeadLock的線程對象td1的屬性flag為1時,第一個線程先鎖定資源O1,睡眠500毫秒,然後嘗試鎖定資源O2(假如沒有被鎖定的話);
第二步:而第一個線程在睡眠的時候,第二個線程對象td2啟動了,其屬性flag為0,它首先鎖定資源O2,然後睡眠500毫秒,嘗試鎖定資源O1,但是此時第一個線程鎖定資源O1,它只能等待;

以上兩步帶來的後果即:
* T1睡眠結束後需要鎖定O2才能繼續執行,而此時O2已被T2鎖定;
* T2睡眠結束後需要鎖定O1才能繼續執行,而此時O1已被T1鎖定;
* T1、T2相互等待,都需要對方鎖定資源才能繼續執行,從而死結。

class DeadLock implements Runnable {public int flag = 1;static Object o1 = new Object(), o2 = new Object();@Overridepublic void run() {System.out.println("flag=" + flag);if (flag == 1) {synchronized (o1) {try {Thread.sleep(500);} catch (Exception e) {e.printStackTrace();}synchronized (o2) {System.out.println("1");}}}if (flag == 0) {synchronized (o2) {try {Thread.sleep(500);} catch (Exception e) {e.printStackTrace();}synchronized (o1) {System.out.println("0");}}}}public static void main(String[] args) {DeadLock td1 = new DeadLock();DeadLock td2 = new DeadLock();td1.flag = 1;td2.flag = 0;new Thread(td1).start();new Thread(td2).start();}}

【程式碼範例】 一個簡單的Java死結

聯繫我們

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