Heim  >  Artikel  >  Java  >  Das Konzept und die Lösung von Deadlocks in Java

Das Konzept und die Lösung von Deadlocks in Java

零下一度
零下一度Original
2017-07-20 13:41:312858Durchsuche

1. Prozess-Deadlock und Lösungen

1. Kernpunkte

(1) Beherrschen Sie das Konzept des Deadlocks und das Auftreten von Deadlocks Die Grundursache der Sperre.

(2) Verstehen Sie die notwendigen Bedingungen für einen Deadlock – die folgenden vier Bedingungen müssen gleichzeitig erfüllt sein: gegenseitige Ausschlussbedingung, Nicht-Vorkaufsbedingung, Besitz- und Anwendungsbedingung und Schleifenwartebedingung.

(3) Erinnern Sie sich an die allgemeinen Methoden zur Lösung von Deadlocks und beherrschen Sie die Grundideen der Deadlock-Prävention und Deadlock-Vermeidung.

(4) Beherrschen Sie die Strategie der geordneten Ressourcenzuteilung in der Strategie zur Verhinderung von Deadlocks.

(5) Verstehen Sie das Konzept der Prozesssicherheitssequenz und die Beziehung zwischen Deadlock und Sicherheitssequenz.

(6) Verstehen Sie den Bankalgorithmus.

(7) Verstehen Sie das Ressourcenzuteilungsdiagramm.

(8) Verstehen Sie die Ideen der Deadlock-Erkennung und -Behebung.

2. Was Deadlock betrifft, mein persönliches Verständnis:

Nach einer gewissen Zeit des Studiums verstehe ich zum Beispiel, dass es zwei Prozesse gibt Jeder A-Prozess ist durch zwei Sperren gesperrt (Sperre 1, Sperre 2). Der Unterschied besteht darin, dass die Speicherorte der Sperranwendung in den beiden Prozessen unterschiedlich sind. Daher erfordert der vollständige Start eines Prozesses eine interne Sperre, und diese Sperre befindet sich zufällig in einem anderen Prozess. Die Sperre, die ein anderer Prozess benötigt, um den internen Prozess vollständig zu starten (oder auszuführen), befindet sich in einem anderen Programm. Auf diese Weise sind sie aneinander gebunden und befinden sich alle in einem Zustand der Vorbereitung, sind aber nicht in der Lage, sie auszuführen. Hat einen Deadlock-Zustand verursacht. Basierend auf meinem Verständnis habe ich ein schematisches Diagramm gezeichnet:

3. Ein einfacher Code zum Thema Deadlock:
public class Test15 {public static void main(String[] args) throws InterruptedException {new Thread(new DeadLockThread(true)).start();//Thread.sleep(10);在中间用上它可以使结果交替出现,我是为了看死锁的效果,用它对比一下。new Thread(new DeadLockThread(false)).start();
    }
}class DeadLockThread implements Runnable {static Object o1 = new Object();static Object o2 = new Object();private boolean flag;

    DeadLockThread(boolean flag) {this.flag = flag;
    }public void run() {if (flag == true) {while (true) {synchronized (o1) {
                    System.out.println("这是锁o1");synchronized (o2) {
                        System.out.println("这是锁o2");
                    }

Ergebnisse drucken:

4. In Bezug auf Deadlock habe ich nach Based gesucht Aufgrund einiger Informationen habe ich das Gefühl, dass die Probleme hier ziemlich kompliziert sind. Zu diesem Zeitpunkt sind nur diese einfachen Prinzipien verstanden. Wir können auch grob verstehen, dass bestimmte vier Bedingungen erfüllt sein müssen, damit ein Deadlock auftritt.
1) Gegenseitige Ausschlussbedingungen:
bezieht sich auf die ausschließliche Nutzung zugewiesener Ressourcen durch einen Prozess, d. h. eine bestimmte Ressource wird innerhalb eines bestimmten Zeitraums nur von einem Prozess belegt. Wenn zu diesem Zeitpunkt andere Prozesse Ressourcen anfordern, kann der Anforderer nur warten, bis der Prozess, der die Ressourcen belegt, freigegeben wird.
2) Anforderungs- und Haltebedingungen:
bedeutet, dass der Prozess mindestens eine Ressource gehalten hat, aber eine neue Ressourcenanforderung gestellt hat und die Ressource zu diesem Zeitpunkt von anderen Prozessen belegt wurde Zeitlich wird der Anforderungsprozess blockiert, aber andere Ressourcen, die sie erhalten haben, bleiben erhalten.
3) Bedingungen ohne Entzug:
bezieht sich auf die Ressourcen, die der Prozess erhalten hat, bevor er aufgebraucht ist, und kann nur von selbst freigegeben werden, wenn er verwendet wird hoch.
4) Schleifenwartebedingung:
bedeutet, dass beim Auftreten eines Deadlocks ein Prozess vorhanden sein muss – eine kreisförmige Kette von Ressourcen, dh der Prozesssatz {P0, P1, P2, ... , P0 in Pn} wartet auf eine von P1 belegte Ressource; P1 wartet auf eine von P2 belegte Ressource,..., Pn wartet auf eine von P0 belegte Ressource.
Anhang:
1) Durch den Aufruf der Sleep()-Methode wird der Thread die von ihm gehaltene Synchronisationssperre nicht aufheben und während dieser Zeit werden andere Threads nicht verhindert von der Ausführung
2) Rufen Sie die Methode wait() auf, und der aktuell laufende Thread wechselt in den Wartezustand und wartet darauf, dass andere Threads die Methode notify() oder notifyAll() dieses Objekts erneut aufrufen, um es zu aktivieren Oder wenn die angegebene Wartezeit erreicht ist, wird der Thread automatisch aktiviert.
Wenn ein Thread eine Synchronisationssperre für ein oder mehrere Objekte besitzt, gibt der Thread nach dem Aufruf von wait() alle von ihm gehaltenen Synchronisationsressourcen frei, nicht beschränkt auf das Methodenobjekt, das wait() aufgerufen hat .
3) In der tatsächlichen Entwicklung sind Deadlocks im Allgemeinen tief verborgen und schwer zu erkennen. Sobald ein Deadlock auftritt, führt dies unweigerlich zu einer Programmlähmung. Deshalb muss es vermieden werden.

Das obige ist der detaillierte Inhalt vonDas Konzept und die Lösung von Deadlocks in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn