2016-03-31 12 views
0

最近、私はその資料をJavaのドキュメントhereからレビューする機会を得ました。それには次のコードが含まれています。それに加えてネストされたクラスの同期

public class AnotherDeadlockCreator { 

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) { 

    AnotherDeadlockCreator obj = new AnotherDeadlockCreator(); 

    final AnotherDeadlockCreator.Friend alphonse = 
     obj.new Friend("Alphonse"); 

    final AnotherDeadlockCreator.Friend gaston = 
      obj.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(); 
} 

}

、私は、ネストされたクラスの同期ロックが入れ子になったクラスの「この」にロックされたことを読みました。以下を参考にしてください。

Locking and synchronization between outer and inner class methods?

今、私は理解していないものです - 私たちはデッドロックコードに(入れ子になったクラスのロックについて)上記請求を適用すると、このつもりは最も可能性の高いデッドロックを引き起こしますか?スレッドが異なるオブジェクトのネストされたクラスの同期メソッドにアクセスする場合、デッドロックがどのように発生するのでしょうか?私はいくつかの重要なものを欠いていますか?

ありがとうございました。

答えて

0

bow()とbowBack()は、Friendインスタンスの同じオブジェクト(alphonseとgaston)で同期します。

alphonse.bow(gaston) is invoked at time T. (alphonse synch started) 
gaston.bow(alphonse) is invoked at time T + 1. (gaston synch started) 
gaston.bowBack(alphonse) is invoked at time T + 2. (gaston synch already taken...waiting) 
alphonse.bowBack(gaston) is invoked at time T + 3. (alphonse synch already taken...waiting) 

--DeadLock:ここ

は、デッドロックの一例です。

+0

はい、間違いありません。しかし、これはここでデッドロックを引き起こすべきではありません。 2つのスレッドを通して呼び出されるオブジェクトは異なっているため、それらは異なるスコープを持ちます - 共有されていません。したがって、メソッドが静的でない限り、ロックは停止して他が終了するのを待つべきではありません。 – zgulser

関連する問題