Pregunta sobre la situación de punto muerto en Java
Estoy aprendiendo sobre los puntos muertos en Java, y hay un código de ejemplo del tutorial oficial de Sun:
Alphonse y Gaston son amigos, y grandes creyentes en cortesía. Una regla estricta de cortesía es que cuando te inclinas ante un amigo, debes permanecer inclinado hasta que tu amigo tenga la oportunidad de devolver el arco. Desafortunadamente, esta regla no tiene en cuenta la posibilidad de que dos amigos puedan inclinarse el uno al otro al mismo tiempo.
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();
}
}
Aquí está la explicación de Sun:
Cuando se ejecuta Deadlock, es extremadamente probable que ambos hilos se bloqueen cuando intenten invocar BowBack. Ninguno de los bloques nunca terminará, porque cada hilo está esperando que el otro salga del arco.
Parece que no acabo de seguir. Cuando se ejecuta alphonse.bow (gaston), el método de arco se bloquea. Así que ahora se imprimirá por primera vez "¡Gaston se inclinó ante mí!". Luego continuará y llamará a BowBack, y también bloqueará BowBack. ¿Cómo puede esto causar un punto muerto? ¿Estoy entendiendo mal lo que sucede cuando se llama a un método sincronizado?
Si alguien me puede dar una explicación fácil, gracias.