2016-04-28 38 views
0

我在理解Oracle教程中的這個特定死鎖示例時遇到了問題。 我認爲我對死鎖是什麼有一個很好的想法(我已經看到了很多的例子,其中兩個最終的對象鎖創建,一個線程獲得第一個和第二個),但這個似乎更復雜。棘手的死鎖示例

爲什麼無法在不阻止程序的情況下調用bowBack()方法?如果方法同步於這個 - 如果我理解正確,這實際上是同步方法的工作方式 - 然後線程不共享資源,這會導致它們彼此等待。

是因爲如果你試圖在另一個同步方法中調用一個同步方法,你需要在這個外部方法中是「唯一的線程」?

從我收集,他們都進入弓()同時所有的罰款,直到bowBack()被調用......

public class Deadlock { 
    static class Friend { 
     private final String name; 
     public Friend(String name) { 
      this.name = name; 
     } 
     public String getName() { 
      return this.name; 
     } 
     public synchronized void bow(Friend bower) { 
      System.out.format("%s: %s" 
       + " has bowed to me!%n", 
       this.name, bower.getName()); 
      bower.bowBack(this); 
     } 
     public synchronized void bowBack(Friend bower) { 
      System.out.format("%s: %s" 
       + " has bowed back to me!%n", 
       this.name, bower.getName()); 
     } 
    } 

    public static void main(String[] args) { 
     final Friend alphonse = 
      new Friend("Alphonse"); 
     final Friend gaston = 
      new Friend("Gaston"); 
     new Thread(new Runnable() { 
      public void run() { alphonse.bow(gaston); } 
     }).start(); 
     new Thread(new Runnable() { 
      public void run() { gaston.bow(alphonse); } 
     }).start(); 
    } 
} 

回答

1

的重要組成部分,這裏是該參數/參數也被鎖定,並且bowback方法在另一個對象上調用,而不是在this上。

如果行改爲this.bowback()一切都會好的,但它是anotherObject.bowback(),並且該對象試圖自行同步,但已被另一個線程鎖定。