Я изучаю взаимоблокировки на Java, и вот этот пример кода из официального руководства Sun:
Альфонс и Гастон - друзья, и великие верующие в вежливости. Строгий правило вежливости заключается в том, что когда вы другу, вы должны оставаться поклонившимся пока у вашего друга не появится верните лук. К сожалению, это правило не учитывает возможность того, что двое друзей могут поклониться друг к другу в то же время.
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();
}
}
Здесь объяснение Солнца:
Когда Deadlock запускается, он чрезвычайно вероятно, что оба потока будут блокированы когда они пытаются вызвать bowBack. Ни один блок никогда не закончится, потому что каждая нить ждет другого для выхода из лука.
Я не совсем понимаю. Когда альфонс.бот (гастон) работает, метод лука заблокирован. Итак, теперь он сначала напечатает "Гастон поклонился мне!". Затем он продолжится и вызовет bowBack, а также заблокирует bowBack. Как это может вызвать тупик? Я не понимаю, что происходит при вызове синхронного метода?
Если кто-то может дать мне легкое объяснение, спасибо.