Was ist ein Deadlock
Schauen wir uns zuerst ein solches Beispiel für das Leben an: Es gibt eine Brücke auf einem Fluss mit einem schmalen Brückendeck, das nur ein Auto aufnehmen kann und nicht zulassen, dass zwei Autos parallel fahren. Wenn zwei Autos A und B von beiden Enden der Brücke auf die Brücke fahren, geht es für das Auto A über einen Straßenabschnitt auf der linken Seite des Brückendecks (dh ein Teil der Ressourcen der Brücke). Wenn Sie die Brücke überqueren möchten, müssen Sie auf das Auto B warten, um das Brückendeck rechts aufzugeben. Auto A kann zu diesem Zeitpunkt nicht vorwärts gehen; Für das Auto B geht es über einen Teil der Straße auf der rechten Seite des Brückendecks (dh es nimmt einen Teil der Ressourcen der Brücke ein). Wenn Sie die Brücke überqueren möchten, müssen Sie warten, bis das Auto A das Brückendeck links aufgibt, und das Auto B kann zu diesem Zeitpunkt nicht vorwärts gehen. Die Autos auf beiden Seiten kehrten nicht um, was dazu führte, dass einander das Brückendeck aufgab, aber niemand gab nach und würde endlos warten. Dieses Phänomen ist Deadlock. Wenn das Auto mit einem Prozess verglichen wird und das Brückendeck als Ressource verwendet wird, wird das obige Problem als: Prozess A Ressourcen R1 besitzt, das auf Ressource RR wartet, das durch Prozess B besetzt ist; Prozess B besitzt eine Ressource RR und wartet auf die Ressourcen R1, die von Prozess A besetzt ist. Darüber hinaus dürfen die Ressourcen R1 und RR nur einen Prozess besetzen, dh zwei Prozesse dürfen nicht gleichzeitig besetzen. Infolgedessen kann keiner der beiden Prozess weiterhin ausgeführt werden. Wenn keine weiteren Maßnahmen ergriffen werden, wird diese Wartestation in diesem Zyklus auf unbestimmte Zeit fortgesetzt, und ein Prozess -Deadlock tritt auf.
In Computersystemen können Software- und Hardware -Ressourcen abgestimmt werden. Zum Beispiel: Es gibt nur einen CD-ROM-Treiber und einen Drucker im System. Ein Prozess besitzt den CD-ROM-Treiber und gilt für einen Drucker. Der andere Prozess besitzt den Drucker und gilt für eine CD-ROM. Infolgedessen sind beide Prozesse blockiert und können niemals alleine getrennt werden.
Der sogenannte Deadlock bezieht sich auf eine Situation, in der mehrere Prozesse durch die Ressourcen fahren, die sie besetzen und auf unbestimmte Zeit in einer Pattsituation bleiben. Wenn es keine externe Kraft gibt, werden alle Prozesse, die mit Deadlock beteiligt sind, immer blockiert. Aus dem obigen Beispiel können wir erkennen, dass der grundlegende Grund für Deadlocks in Computersystemen begrenzte Ressourcen und einen unangemessenen Betrieb ist. Das heißt: Ein Grund dafür ist, dass das System zu wenige Ressourcen bereitstellt und die Ressourcenanforderungen für gleichzeitige Prozesse nicht erfüllt. Dieser durch konkurrierende Ressourcen verursachte Deadlock ist der Kern unserer Diskussion. Zum Beispiel: Nachricht ist eine temporäre Ressource. Irgendwann wartet der Prozess A auf eine von Prozess B gesendete Nachricht, der Prozess B wartet auf eine Nachricht, die von Prozess C gesendet wurde, und der Prozess C wartet auf eine Nachricht, die von Prozess A gesendet wird. Wenn die Nachricht nicht angekommen ist, kann keiner der drei Prozesse A, B und C nicht vorwärts gehen, und Deadlocks treten auch in der Prozesskommunikation auf. Ein weiterer Grund sind Deadlocks, die durch unangemessene Prozessaufstiegsanordnung verursacht werden. Kleine Ressourcen führen möglicherweise nicht unbedingt zu Deadlocks. Genauso wie zwei Personen, die eine einzelnen Brücke überqueren, werden sie, wenn beide zuerst bestehen müssen und auf der Einklangbrücke verfolgt werden, unweigerlich zu einem Deadlock für Wettbewerbsressourcen. Wenn jedoch zuerst zwei Personen prüfen, ob es andere Personen auf der Brücke gibt, bevor sie zur Brücke gehen, und nur die Brücke hinaufgehen, wenn es keine anderen Personen auf der Brücke gibt, wird das Problem gelöst. Wenn das Programm unangemessen gestaltet ist und der Prozess unangemessen gefördert wird, wird es auch zu Deadlocks führen.
Deadlock
Nur wenn T1 -Thread O1 einnimmt und auch O2 benötigt und T2 zu diesem Zeitpunkt O2 nimmt und auch O1 erfordert, wird es einen Deadlock geben. (Ähnlich wie zwei Personen, die mit zwei Essstäbchen essen, brauchen beide einen Essstäbchen von der anderen Party zum Essen)
Der folgende Code: Der T1 -Thread nimmt O1 ein und veröffentlicht nur O1, nachdem das O2 -Objekt erhalten wurde. Der T2 -Faden nimmt zuerst O2 ein und erwirbt dann O1. Zu diesem Zeitpunkt ist O1 vom T1 -Thread besetzt, O2 wird vom T2 -Thread besetzt, T1 und T2 warten unendlich und es wird ein Deadlock auftreten.
Paket Javasimple;/** * Deadlock Demo * @Author Haokui * */public class Dieynchronisierte {public static void main (String [] args) {/** * Erstellen und starten Sie zwei Threads T1 und T2. Beide Threads müssen zwei Objekte O1 und O2*/ Object O1 = neues Objekt () teilen. Objekt O2 = neues Objekt (); Thread T1 = neuer Thread (neuer T1 (O1, O2)); Thread T2 = neuer Thread (neuer T2 (O1, O2)); t1.start (); t2.Start (); }} // Erstellen Sie zwei Thread -Klassen T1 implementiert runnable {Objekt O1; Objekt O2; public T1 (Objekt O1, Objekt O2) {this.o1 = O1; this.o2 = o2; } public void run () {// sperrt O1 und O2 synchronisiert (O1) {try {thread.sleep (1000); } catch (InterruptedException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } synchronisiert (O2) {System.out.println ("O2"); }}}}}}} Klasse T2 implementiert Runnable {Object O1; Objekt O2; public T2 (Objekt O1, Objekt O2) {this.o1 = O1; this.o2 = o2; } public void run () {synchronized (o2) {try {thread.sleep (1000); } catch (InterruptedException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } synchronized (O1) {System.out.println ("O1"); }}}} Hinweis: Die Parallelität tritt nur dann auf, wenn O1 und O2 geteilt werden. Zwei Objekte können über Konstruktoren geteilt werden.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.