Deadlock
Schraube ist ein sehr nützliches Werkzeug mit vielen Anwendungen, da es sehr einfach zu bedienen und leicht zu verstehen ist. Gleichzeitig wird es auch einige Probleme bringen, das heißt, es kann zu Deadlock führen. Sobald ein Deadlock auftritt, ist die Systemfunktionen nicht verfügbar. Schauen wir uns zunächst einen Code an, der Deadlocks verursacht und Thread -Thread_1 und Thread_2 darauf warten, dass die Sperre aufeinander abgelassen wird.
Paket -Thread; öffentliche Klasse Deadlockdemo {private statische Zeichenfolge a = "a"; private statische Zeichenfolge b = "b"; public static void main (String args []) {new DeadlockDemo (). Deadlock ();} private void Deadlock () {// Thread_1 Thread_1 = New Runnable () {NEW Runnable (). {System.err.println ("-Thread_1 Lock a ----"); {System.out.println("--thread_2 lock B-----");synchronized (A) {System.out.println("--thread_2 lock A----");}}}});thread_1.start();thread_2.start();}}}Dieser Code ist nur eine Demonstration von Szenarien mit Deadlock, und in Wirklichkeit schreiben Sie einen solchen Code möglicherweise nicht. In einigen komplexeren Szenarien können Sie jedoch auf solche Probleme stoßen, wie z. Oder Thread_1 erhält ein Datenbankkabel, und eine Ausnahme wird beim Verlassen des Schlosses ausgelöst, aber es wird nicht veröffentlicht.
Sobald ein Deadlock auftritt, ist das Geschäft wahrnehmbar, da der Service nicht erbracht werden kann. Anschließend können Sie nur überprüfen, welches Thread das Problem über den Dump -Thread hat. Die folgenden Thread -Informationen zeigen uns, dass die Zeilen 35 und 21 der Deadlockdemo -Klasse den Deadlock verursacht haben.
"Thread-1" prio=6 tid=0x000000000cb13800 nid=0x19ac waiting for monitor entry [0 x000000000d67f000] java.lang.Thread.State: BLOCKED (on object monitor) at thread.DeadLockDemo$2.run(DeadLockDemo.java:35) - waiting to lock <0x00000007d5a9be88> (a java.lang.String) - gesperrt <0x00000007d5a9beb8> (a java.lang.String) bei Java.lang.Thread.run (Unbekannte Quelle) "Thread -0" PRIO = 6 TID = 0x00000000000000000D4800000D4F000 × 0x6BC Warted auf Monitor -Einstieg [0x0000000000000D48000 × 0x6bc Warted auf Monitor -Einstieg [0x0000000000000D48000 × 0x6bc, Monitor -Eintrag [0x 00000000000), [0x 000000000 00000 00000 usw. java.lang.Thread.State: BLOCKED (on object monitor) at thread.DeadLockDemo$1.run(DeadLockDemo.java:21) - waiting to lock <0x00000007d5a9beb8> (a java.lang.String) - locked <0x00000007d5a9be88> (a java.lang.String) at java.lang.thread.run (unbekannte Quelle)
Mehrere häufige Möglichkeiten, um Deadlocks zu vermeiden.
Vermeiden Sie es, mehrere Schlösser gleichzeitig mit einem Faden zu erwerben.
Vermeiden Sie einen Thread, der mehrere Ressourcen gleichzeitig im Seil einnimmt, und versuchen Sie sicherzustellen, dass jedes Seil nur eine Ressource verbraucht.
Versuchen Sie, die zeitliche Suche mit Lock.tryLock (Timeout) zu verwenden, anstatt den internen Suchmechanismus zu verwenden.
Bei Datenbankkabeln muss das Sperren und Entsperren in einer Datenbankverbindung bestehen, da ansonsten die Entsperrung fehlschlägt.
Referenz:
//www.vevb.com/article/131946.htm
//www.vevb.com/article/131943.htm
Zusammenfassen
Das obige ist die vollständige Codeanalyse der gemeinsamen Methoden von Java, um Deadlocks in diesem Artikel zu vermeiden. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!