2016-04-28 15 views
0

私は、このチュートリアルのデッドロックの例をOracleチュートリアルから理解することに問題があります。 デッドロックが何であるか(私は2つの最終的なオブジェクトロックが作成され、1つのスレッドが最初のスレッドと2つ目のスレッドを獲得する例をたくさん見てきましたが)、これはもっと複雑なようです。トリッキーなデッドロックの例

なぜプログラムをブロックせずに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

重要な部分は、パラメータ/引数もロックされていることですまた、thisではなく、別のオブジェクトに対してbowbackメソッドが呼び出されます。

行が代わりにthis.bowback()を読み込んだとしても、それはanotherObject.bowback()ですが、そのオブジェクトは同期しようとしましたが、別のスレッドによって既にロックされています。