альфонс и гастон - два разных объекта. Каждый объект имеет встроенный монитор (замок), связанный с ним.
Это может произойти так:
Альфонс создан. Его объект монитора равен 1.
гастон создан. Его объект монитора составляет 2.
alphonse.bow (Гастон);
Альфонс теперь владеет замком # 1
gaston.bow (Альфонс);
Гастон теперь владеет замком # 2
Альфонс вызывает bowBack на гастоне и ждет блокировки №2.
Гастон вызывает BowBack на Alphonse и ждет блокировки # 1
Имеет смысл? Использование синхронизированных блокировок ключевых слов, которые экземпляры отслеживают на протяжении всего метода. Пример можно переписать следующим образом:
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void bow(Friend bower) {
synchronized(this) {
System.out.format("%s: %s has bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
}
}
public void bowBack(Friend bower) {
synchronized(this) {
System.out.format("%s: %s has bowed back to me!%n",
this.name, bower.getName());
}
}
}
}