Ich lerne über Deadlocks in Java, und es gibt diese Beispielcode von Sun offizielle Tutorial:Frage zu Deadlock-Situation in Java
Alphonse und Gaston sind Freunde, und große Gläubigen in Höflichkeit. Eine strikte Regel der Höflichkeit ist, dass, wenn Sie an einen Freund verbeugen, müssen Sie gebeugt bleiben, bis Ihr Freund eine Chance hat, den Bogen zurückzubringen. Leider berücksichtigt diese Regel nicht die Möglichkeit, dass zwei Freunde zur gleichen Zeit sich verbeugen können.
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();
}
}
Hier Suns Erklärung:
Wenn Deadlock läuft, ist es extrem wahrscheinlich, dass beide Threads blockieren, wenn sie bowBack aufzurufen versuchen. Kein Block wird jemals enden, weil jeder Thread auf den anderen wartet, um Bogen zu verlassen.
Ich glaube nicht ganz zu folgen. Wenn alphonse.bow (Gaston) läuft, ist die Bogenmethode gesperrt. Jetzt wird es zuerst gedruckt "Gaston hat sich vor mir verbeugt!". Dann wird es weitergehen und BowBack rufen, und auch BowBack sperren. Wie kann dies zu einem Stillstand führen? Missverstehe ich, was passiert, wenn eine synchronisierte Methode aufgerufen wird?
Wenn mir jemand eine einfache Erklärung geben kann, danke.
Sieht aus wie es viele richtige Antworten sind hier, aber ich denke, es könnte hilfreicher sein, die Antworten in zwei separate Spalten zu formatieren, von denen jede einen anderen Thread darstellt. Dies wird wirklich die Tatsache nach Hause fahren, dass 2 Sätze von Anweisungen gleichzeitig ausgeführt werden können. –
mögliches Duplikat von [Versuch, mein kleines Gehirn umzustellen, wie Threads Deadlock] (http://stackoverflow.com/questions/749641/trying-to-wrap-my-wee-brain-around-how-threads-deadlock) –
Ich habe ähnliche Verwirrung. Danke für den Beitrag und die Antworten. –