Java -Thread -Priorität <BR /> Der spezielle Fehlertyp mit Multitasking, der vermieden werden muss, ist Deadlock. Deadlock tritt auf, wenn zwei Fäden eine kreisförmige Abhängigkeit von einem Paar synchroner Objekte haben. Nehmen wir beispielsweise an, ein Thread tritt in die Pipeline von Objekt X ein und ein anderer Thread tritt in die Pipeline von Objekt Y ein. Wenn Xs Thread versucht, die Synchronisationsmethode von Y aufzurufen, wird er wie erwartet gesperrt. Der Y -Thread möchte auch einige Synchronisierungsmethoden von X aufrufen, und der Thread wartet für immer, denn um X zu erreichen, muss er eine eigene Sperre von Y freigeben, um den ersten Thread vollständig zu machen. Deadlock ist ein sehr schwieriger Fehler zu debuggen, weil:
Normalerweise passiert es selten und geschieht nur, wenn die Zeit der beiden Threads nur übereinstimmt.
Es kann mehr als zwei Threads und synchrone Objekte enthalten (dh Deadlocks können auftreten, wenn komplexere Ereignisse als das gerade beschriebene Beispiel vorliegen).
Um Deadlock vollständig zu verstehen, ist es nützlich, sein Verhalten zu beobachten. Das folgende Beispiel erzeugt zwei Klassen A und B mit Foo () bzw. bar () -Methoden. Diese beiden Methoden haben eine kurze Pause, bevor sie Methoden anderer Klassen aufrufen. Die Hauptklasse mit dem Namen Deadlock erstellt Instanzen von A und B und startet dann einen zweiten Thread, um eine Deadlock -Umgebung einzurichten. Die Methoden Foo () und Bar () verwenden Schlaf (), um Deadlock zu erzwingen.
// ein Beispiel für Deadlock.Class a {synchronisierte void foo (b b) {String name = thread.currentThread (). GetName (); Thread .Sep (1000); (); System .out.println (Name + "Eingegebener B.Bar"); n (Name + "Versuch, A.Last () zu nennen"); {A = new a (); (); Lock auf B in anderen Threads. Nach dem Ausführen des Programms lautet die Ausgabe wie folgt:
Mainthead trat in A. fooracingThread ein.
Da das Programm abgestimmt ist, müssen Sie Strg-C drücken, um das Programm zu beenden. Drücken Sie Strg-Break auf dem PC (oder drücken Sie Strg-/ unter Solaris) und Sie können den vollständigen Faden und den Pipeline-Pufferhaufen sehen. Sie werden sehen, dass RacingThread den Managementprozess B besetzt, während Sie auf den Managementprozess A warten, und gleichzeitig ein Mainthread auf dem Managementprozess basiert b. Das Programm wird niemals enden. Wie dieses Beispiel zeigt, ist Ihr Multithread -Programm häufig gesperrt, und Deadlock ist das erste Problem, das Sie überprüfen sollten.
Java -Thread -Deadlock <br /> Der spezielle Fehlertyp mit Multitasking, der vermieden werden muss, ist Deadlock. Deadlock tritt auf, wenn zwei Fäden eine kreisförmige Abhängigkeit von einem Paar synchroner Objekte haben. Nehmen wir beispielsweise an, ein Thread tritt in die Pipeline von Objekt X ein und ein anderer Thread tritt in die Pipeline von Objekt Y ein. Wenn Xs Thread versucht, die Synchronisationsmethode von Y aufzurufen, wird er wie erwartet gesperrt. Der Y -Thread möchte auch einige Synchronisierungsmethoden von X aufrufen, und der Thread wartet für immer, denn um X zu erreichen, muss er eine eigene Sperre von Y freigeben, um den ersten Thread vollständig zu machen. Deadlock ist ein sehr schwieriger Fehler zu debuggen, weil:
Normalerweise passiert es selten und geschieht nur, wenn die Zeit der beiden Threads nur übereinstimmt.
Es kann mehr als zwei Threads und synchrone Objekte enthalten (dh Deadlocks können auftreten, wenn komplexere Ereignisse als das gerade beschriebene Beispiel vorliegen).
Um Deadlock vollständig zu verstehen, ist es nützlich, sein Verhalten zu beobachten. Das folgende Beispiel erzeugt zwei Klassen A und B mit Foo () bzw. bar () -Methoden. Diese beiden Methoden haben eine kurze Pause, bevor sie Methoden anderer Klassen aufrufen. Die Hauptklasse mit dem Namen Deadlock erstellt Instanzen von A und B und startet dann einen zweiten Thread, um eine Deadlock -Umgebung einzurichten. Die Methoden Foo () und Bar () verwenden Schlaf (), um Deadlock zu erzwingen.
// ein Beispiel für Deadlock.Class a {synchronisierte void foo (b b) {String name = thread.currentThread (). GetName (); Thread .Sep (1000); (); System .out.println (Name + "Eingegebener B.Bar"); n (Name + "Versuch, A.Last () zu nennen"); {A = new a (); (); Lock auf B in anderen Threads. Nach dem Ausführen des Programms lautet die Ausgabe wie folgt:
Mainthead trat in A. fooracingThread ein.
Da das Programm abgestimmt ist, müssen Sie Strg-C drücken, um das Programm zu beenden. Drücken Sie Strg-Break auf dem PC (oder drücken Sie Strg-/ unter Solaris) und Sie können den vollständigen Faden und den Pipeline-Pufferhaufen sehen. Sie werden sehen, dass RacingThread den Managementprozess B besetzt, während Sie auf den Managementprozess A warten, und gleichzeitig ein Mainthread auf dem Managementprozess basiert b. Das Programm wird niemals enden. Wie dieses Beispiel zeigt, ist Ihr Multithread -Programm häufig gesperrt, und Deadlock ist das erste Problem, das Sie überprüfen sollten.