J'apprends en Java sur les blocages, et il y a cet exemple de code de tutoriel officiel de Sun:Question A propos Deadlock Situation en Java
Alphonse et Gaston sont des amis, et grands croyants dans la courtoisie. Une règle stricte de courtoisie est que lorsque vous inclinez à un ami, vous devez rester incliné jusqu'à ce que votre ami a une chance de retourner l'arc. Malheureusement, cette règle ne tient pas compte de la possibilité que deux amis puissent s'incliner l'un à l'autre en même temps.
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();
}
}
est ici l'explication de Sun:
Lorsque Deadlock fonctionne, il est extrêmement probable que les deux fils bloquent lorsqu'ils tentent d'invoquer bowBack. Aucun bloc ne se terminera jamais, car chaque thread attend l'autre pour quitter l'arc.
Je ne semble pas tout à fait suivre. Quand alphonse.bow (gaston) s'exécute, la méthode d'arc est verrouillée. Alors maintenant, il va d'abord imprimer "Gaston s'est incliné devant moi!". Ensuite, il va continuer à appeler bowBack, et verrouille bowBack aussi bien. Comment cela peut-il causer une impasse? Ai-je mal compris ce qui se passe quand une méthode synchronisée est appelée?
Si quelqu'un peut me donner une explication facile, merci.
On dirait qu'il ya beaucoup de bonnes réponses, mais je pense qu'il pourrait être plus utile pour formater les réponses en 2 colonnes distinctes, chacune représentant un fil différent. Cela va vraiment motiver le fait que 2 séries d'instructions peuvent être exécutées simultanément. –
duplicata possible de [Essayer d'envelopper mon cerveau wee autour de l'impasse des threads] (http://stackoverflow.com/questions/749641/trying-to-wrap-my-wee-brain-around-how-threads-deadlock) –
J'ai une confusion similaire. Merci pour le message et les réponses. –