は、次のことを考えてみましょう:デッドロックプロセスどちらが最初にロックされますか?
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("\n%S: %S has bowed to me!" , this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("\n%S: %S has bowed back to me!", this.name, bower.getName());
}
}
public static void main(String[] args) {
final Friend alf = new Friend("Alf");
final Friend arian = new Friend("Arian");
// Thread 1
new Thread(new Runnable() {
public void run(){ alf.bow(arian);}}).start();
//Thread 2
new Thread(new Runnable() {
public void run(){ arian.bow(alf);}}).start();
}
}
アウトプットが
ALFです:牡羊座生まれの私にお辞儀しています! アリラン:ALFは私に弓を掛けました!
LOCK状況.....
スレッド1つの実行は、そのオブジェクトの友達のロックを必要とします。その直後に、スレッド2は第2のオブジェクトをロックする必要があります。今度は、方法の弓はスレッド1によってロックされているので、 "ALF:ARIANが私に弓をかけました!スレッド2はどのように入力されますか弓いずれも入力できません* bowBack * ??
メソッドは常にthis
で同期することを念頭に置いよろしくB.
多くのご意見ありがとうございます。 –