私は、このチュートリアルのデッドロックの例を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();
}
}