Wann immer Sie mehrere Schlösser A, B und C haben, können Sie Deadlock haben, wenn Sie nicht garantieren, dass Ihr Code versucht, diese Schlösser in derselben Reihenfolge zu erwerben.
final Lock A = new ReentrantLock();
final Lock B = new ReentrantLock();
final Lock C = new ReentrantLock();
A, b, c oder c, b, a oder a, c, b - es spielt keine Rolle, solange die Reihenfolge konsistent ist.
Ein Problem tritt auf, wenn Sie einen Codepfad haben, den Sie versuchen für: a, b, c und einen anderen, der nach C, B, a.
Wie Sie wahrscheinlich erraten können, da A und C beide gehalten werden, wird einer der beiden B und dann BEDLOCK. (AKA Sie haben einen Zyklus im Ressourcenverriegelungsdiagramm)
Formell sprechend kann Deadlock entstehen nur wenn Alle folgenden Bedingungen finden:
- Keine Präsentation: Das System gibt nach Zuteilung keine Ressourcen. Sie können nur durch den Haltevorgang freigegeben werden.
- Rundschreiben: oben besprochen.
- Gegenseitiger Ausschluss: Nur ein Prozess kann zu einem bestimmten Zeitpunkt eine Ressource verwenden.
- Ressourcenbestand: Derzeit hält ein Prozess mindestens eine Ressource und fordert/wartet auf zusätzliche Ressourcen, die von einem anderen Prozess gehalten werden.
Die beste Lösung besteht darin, sicherzustellen, dass die Reihenfolge konsistent ist oder auf einer höheren (einzelnen) Ebene sperrt. Eine andere Option ist die Verwendung einer Sperrenbibliothek, die beim Versuch, zu sperren (oder Bedingungen zu verwenden und einen eigenen Wrapper zu schreiben, der dies tut). Dieser Ansatz ist jedoch nicht für schwache Nerven. Eine gewisse Implementierung davon wird eine zufällige Zeit warten und es erneut versuchen, aber dies kann mit zunehmender Anzahl der Schlösser sehr ineffizient sein.
Ressourcen:
- Hier ist ein praktischer Artikel über die Analyse von Deadlock in Java, an denen Sie interessiert sein könnten:http://www.journaldev.com/1058/javadeadlock-example-how-t-analyze-adlock-ssituation
- Sie können auch Open -Source -Tools wie JCARDER verwenden, um Deadlock zu finden:http://www.jcarder.org/ Was für Programme mit großen Dumps einfacher sein kann als der Versuch, Dump -Dateien zu gruken.
PS Ich habe nicht viel von Ihrem Code gelesen, da es schlecht formatiert ist und kein minimales Beispiel ist (dh zu windig für unsere Zwecke hier). Dieser Rat sollte jedoch Sie aus theoretischer Sicht beantworten.