JavaRush /Java-Blog /Random-DE /Was ist Deadlock in Java?
Alexey Smirnov
Level 29
Москва

Was ist Deadlock in Java?

Veröffentlicht in der Gruppe Random-DE
Zum Verständnis des Artikels erforderlicher Wissensstand: Sie haben die Java-Syntax- und Java-Core-Quests abgeschlossen und sind nun dabei, Java-Multithreading zu erlernen. Deadlock oder Deadlock in Java oder Deadlock ist ein Fehler, der auftritt, wenn Threads eine zyklische Abhängigkeit von einem Paar synchronisierter Objekte haben. Stellen Sie sich vor, dass ein Thread in den Objektmonitor xund der andere in den Objektmonitor geht y. Wenn ein Thread in einem Objekt xversucht, eine synchronisierte Methode für das Objekt aufzurufen y, und das Objekt ygleichzeitig versucht, eine synchronisierte Methode für das Objekt aufzurufen x, bleiben die Threads beim Warten hängen. Was ist Deadlock?  - 1Unten finden Sie ein Beispiel aus dem Java-Docs-Tutorial zu einem Konzept wie Deadlock. Wo kommt es hier zu Threadblockaden?
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() {
            @Override
            public void run() {
               // System.out.println("Thread 1");
                alphonse.bow(gaston);
               // System.out.println("Th: gaston bowed to alphonse");
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
              //  System.out.println("Thread 2");
                gaston.bow(alphonse);
              //  System.out.println("2.gaston waiting alph bowed");
            }
        }).start();
    }
}
Hier gilt es zwei wichtige Dinge zu verstehen:
  1. Was genau macht jeder der gleichzeitig laufenden Threads?
  2. Welche Schlösser werden verwendet?
Fangen wir am Ende an. Nehmen wir an, Sie haben zwei Objekte der Klasse erstellt Friend: alphonseund gaston. Jeder von ihnen hat sein eigenes Schloss. Somit gibt es zwei dieser Schleusen: Gigolos und Gastons. Wenn eine synchronisierte Methode eines Objekts eingegeben wird, wird deren Sperre gesperrt, und wenn die Methode beendet wird, wird sie freigegeben (oder entsperrt). Nun zu den Threads. Nennen wir den ersten Thread Alphonse(mit einem Großbuchstaben, um ihn vom Objekt Alphonse zu unterscheiden). Das macht es (nennen wir es A, kurz für Alphonse):
A: alphonse.bow(gaston) — получает лок alphonse;
A: gaston.bowBack(alphonse) — получает лок gaston;
A: возвращается из обоих методов, тем самым освобождая лок.
Und hier ist, was der Thread derzeit macht Gaston:
G: gaston.bow(alphonse) — получает лок gaston;
G: alphonse.bowBack(gaston) — получает лок alphonse;
G: возвращается из обоих методов, тем самым освобождая лок.
Lassen Sie uns nun diese Daten zusammenstellen und die Antwort erhalten. Threads können in unterschiedlicher Reihenfolge miteinander verflochten sein (d. h. ihre Ereignisse treten auf). Ein Deadlock funktioniert beispielsweise, wenn die Reihenfolge wie folgt lautet:
A: alphonse.bow(gaston) — получает лок alphonse
G: gaston.bow(alphonse) — получает лок gaston
G: пытается вызвать alphonse.bowBack(gaston), но блокируется, ожидая лока alphonse
A: пытается вызвать gaston.bowBack(alphonse), но блокируется, ожидая лока gaston
Was ist Deadlock?  - 2
In diesem Fall sind beide Threads blockiert und jeder wartet darauf, dass der andere die Sperre aufhebt. Aber keiner von ihnen wird dies tun, da sie dazu ihre Methode abschließen müssen und diese von einem anderen Thread blockiert wird. Sie saßen also dort fest, wo es passierte deadlock. Es ist jedoch auch eine andere Webart möglich, bei der einer der Fäden Zeit hat, fertig zu werden, bevor der zweite beginnt:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
In diesem Fall erfolgt keine gegenseitige Blockierung von Threads. Beispielsweise wurde eine Methode hinzugefügt, die es einem anderen Thread ermöglicht, Zeit zur Ausführung zu haben. Wenn das Ergebnis von der Reihenfolge gleichzeitig auftretender Ereignisse abhängt (geplante Reihenfolge oder Ausführungsgeschwindigkeit), wird ein solcher Prozess auf Russisch als Race Condition bezeichnet – „Race Condition“. Nicht alle Rennbedingungen verursachen möglicherweise einen Deadlock. Meiner Erfahrung nach verursachen jedoch nur Rennbedingungen einen Deadlock. Gepostet von: Dave Lillethun
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION