Di seguito è riportato il codice direttamente dai tutorial Sun che descrive Deadlock. Tuttavia, non capisco come si possa verificare Deadlock in questa situazione considerando entrambi i metodi sincronizzati. In che modo due thread si trovano all'interno degli stessi metodi sincronizzati allo stesso tempo?Una domanda su Deadlock dai tutorial Sun
Deadlock descrive una situazione in cui due o più thread sono bloccati per sempre, in attesa l'uno dell'altro. Ecco un esempio.
Alphonse e Gaston sono amici e grandi credenti in segno di cortesia. Una rigida regola di cortesia è che quando ti inchini ad un amico, devi rimanere inchinato finché il tuo amico non ha la possibilità di restituire l'arco. Sfortunatamente, questa regola non tiene conto della possibilità che due amici si pieghino l'un l'altro allo stesso tempo. Questa applicazione di esempio, Deadlock, modelli questa possibilità:
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();
}
}
Quando Deadlock corre, è estremamente probabile che entrambi i fili bloccheranno quando tentano di richiamare bowBack. Nessun blocco finirà mai, perché ogni thread sta aspettando che l'altro esca dall'arco.
possibile duplicato di [Cercando di avvolgere il mio cervello su come si blocca il thread] (http://stackoverflow.com/questions/749641/trying-to-wrap-my-wee-brain-around-how-threads-deadlock –