2012-04-17 93 views
0

我所經歷的Java線程,特別是僵局的概念,我發現這下面的代碼:請解釋僵局概念

public static void main(String... a) { 

    final String o1 = "Lock "; 
    final String o2 = "Step "; 

    Thread th1 = new Thread() { 
     public void run() { 
      while (true) { 
       synchronized (o1) { 
        synchronized (o2) { 
         System.out.println(o1 + o2); 
        } 
       } 
      } 
     } 

    }; 

    Thread th2 = new Thread() { 
     public void run() { 
      while (true) { 
       synchronized (o2) { 
        synchronized (o1) { 
         System.out.println(o2 + o1); 
        } 
       } 
      } 
     } 

    }; 

    new Thread(th1).start(); 
    new Thread(th2).start(); 

} 

請解釋什麼程序做按我的理解鎖已經採取一個線程,並試圖採取另一個鎖,並通過其他線程完成相同的,當最後當我們開始兩個線程都卡住了,是否有任何其他方式來創建上述程序的死鎖,請告知,還有鎖正在採取上面的代碼是它的實例級鎖。

+0

爲了發生死鎖,你應該改變順序(線程1獲取o1,然後o2,而thread2獲取o2,然後o1)。 – assylias 2012-04-17 13:38:14

+0

我已經做到了..buddy .. !! – user1338319 2012-04-17 13:40:13

回答

2

考慮以下情形:

  • th1o1就中斷,它得到一個機會來鎖定o2前;
  • ​​鎖o2並試圖鎖定o1

這兩個線程都無法取得進一步的進展,並且您有一個deadlock

您的代碼的原始版本(編輯之前)沒有死鎖的可能性,因爲兩個線程都以相同順序獲取了兩個鎖(o1,然後o2)。

+0

看起來像OP已編輯他的帖子。 – mcfinnigan 2012-04-17 13:40:39

+0

我已經做到了現在的哥們,.. !!請解釋上述代碼中發生的情況。 – user1338319 2012-04-17 13:40:53

+0

@ user1338319:查看已更新的答案。 – NPE 2012-04-17 13:42:56

0

要創建死鎖,您需要創建一個情況,其中多個線程正在等待其他線程持有的鎖。例如:

  • 線程1個需要鎖1和鎖2
  • 請求,以便:鎖1,鎖2
  • 線程2個需要鎖1和鎖2
  • 請求,以便:鎖2,鎖1

    1. 線程1請求Lock1。
    2. 線程2請求Lock2。
    3. 線程1獲取Lock1。
    4. 線程2獲取Lock2。
    5. 線程1請求Lock2。
    6. 線程2請求Lock1。
    7. 線程1不能有Lock2,線程2持有它。 /線程1等待...
    8. 線程2不能有Lock1,線程1正在持有它。 /線程2個等待...

在你(第一,未經編輯)例如,兩個線程要求他們在同一順序需要鎖,這是非常重要的。如果Thread1獲取Lock1,則Thread2無法獲取Lock2並創建死鎖,因爲它仍在等待Lock1。可以避免死鎖,因爲兩個線程都試圖以相同的順序獲取鎖。

在您的(新編輯的)示例中,可能會發生死鎖,如上所述。

+0

嗨,山姆,非常感謝,在獲取鎖最重要的順序,最重要的是,你也可以請告訴我如何避免在上面的程序中的死鎖,以便它可以執行正常..! – user1338319 2012-04-17 13:47:16

+0

嗨,山姆也請解釋一下,這裏的同步代表實例級鎖。 thansk提前..! – user1338319 2012-04-17 13:48:58

+0

@ user1338319你可以稱之爲「實例級鎖」......但是當它發生在主體中時,它有什麼意義呢? – 2012-04-17 13:55:32

0

根據您編輯的帖子,th1可以獲取o1,而th2可以獲取o2。然後兩個線程都在等待另一個線程釋放它們還沒有獲取的鎖,並且它從不發生==>死鎖。