Unendliche Schleife in java.util.HashMap

8

Ich habe einige Vaadin-Code-Blockierungen sehr oft hier, und ich habe keine Ahnung, was das Problem sein kann:

%Vor%

Kann jemand vorschlagen, dieses Problem weiter zu debuggen? Das Problem tritt sehr selten auf und ist ziemlich schwierig zu reproduzieren.

    
dangonfast 18.04.2012, 23:45
quelle

3 Antworten

15

Je nachdem, wo es im Code ist, kann ich mir nur vorstellen, dass mehrere Threads auf dieses HashMap zugreifen und es aktualisieren, ohne dass es korrekt synchronisiert wird. Dies kann dazu führen, dass die Datenstrukturen der Zuordnung beschädigt werden und zu einer Endlosschleife führen können.

Ich kann mir keinen anderen Grund vorstellen, warum java.util.HashMap.getEntry blockieren würde. Es führt keine Synchronisierung oder irgendwelche I / O durch.

Roland Illig kommentiert:

  

Die Zeilennummer deutet darauf hin, dass der Code in einer der e = e.next -Schleifen hängt.

Das unterstützt meine Hypothese. Eine bestimmte Sequenz von Operationen in der Hash-Tabelle, die von zwei (oder mehr) Threads ausgeführt wird, hat zur Erzeugung einer Schleife / eines Zyklus in einer der Hash-Ketten geführt. Diese Beschädigung ist aufgetreten, weil zwischen den Threads, die die Operationen ausführen, eine unzureichende Synchronisierung stattgefunden hat. Das passiert sehr selten, aber sobald es passiert ist, wird die Korruption nicht verschwinden.

Ohne tief in den Vaadin-Quellcode zu schauen, kann ich dir nicht genau sagen, ob es ein Vaadin-Bug ist oder ein Fehler in der Art, wie du mit Vaadin verwendest. Jede Erklärung ist plausibel.

AKTUALISIEREN

Basierend auf diesem Artikel (in einem Kommentar unten angegeben) würde ich das sagen ist wahrscheinlich ein Problem in der Art, wie Ihre Anwendung synchronisiert (oder nicht).

    
Stephen C 18.04.2012, 23:53
quelle
7

Was Sie hier tatsächlich sehen, ist ein Thread, der in eine Endlosschleife geht und e = e.next

auswertet

Im Wesentlichen

e.next == e

Dies tritt auf, wenn Sie während einer Umstrukturierung der Tabelle mehrere Threads in eine HashMap einfügen.

Sehen Sie sich diesen Link für weitere Informationen an

Ein schöner Rennzustand

Um dies zu lösen, verwenden Sie entweder Collections.synchronizedMap oder ConcurrentHashMap . Ich schlage das letztere vor.

    
John Vint 19.04.2012 20:51
quelle
2
___ qstntxt ___

Ich habe einige Vaadin-Code-Blockierungen sehr oft hier, und ich habe keine Ahnung, was das Problem sein kann:

%Vor%

Kann jemand vorschlagen, dieses Problem weiter zu debuggen? Das Problem tritt sehr selten auf und ist ziemlich schwierig zu reproduzieren.

    
___ answer10219782 ___

Je nachdem, wo es im Code ist, kann ich mir nur vorstellen, dass mehrere Threads auf dieses %code% zugreifen und es aktualisieren, ohne dass es korrekt synchronisiert wird. Dies kann dazu führen, dass die Datenstrukturen der Zuordnung beschädigt werden und zu einer Endlosschleife führen können.

Ich kann mir keinen anderen Grund vorstellen, warum %code% blockieren würde. Es führt keine Synchronisierung oder irgendwelche I / O durch.

Roland Illig kommentiert:

  

Die Zeilennummer deutet darauf hin, dass der Code in einer der %code% -Schleifen hängt.

Das unterstützt meine Hypothese. Eine bestimmte Sequenz von Operationen in der Hash-Tabelle, die von zwei (oder mehr) Threads ausgeführt wird, hat zur Erzeugung einer Schleife / eines Zyklus in einer der Hash-Ketten geführt. Diese Beschädigung ist aufgetreten, weil zwischen den Threads, die die Operationen ausführen, eine unzureichende Synchronisierung stattgefunden hat. Das passiert sehr selten, aber sobald es passiert ist, wird die Korruption nicht verschwinden.

Ohne tief in den Vaadin-Quellcode zu schauen, kann ich dir nicht genau sagen, ob es ein Vaadin-Bug ist oder ein Fehler in der Art, wie du mit Vaadin verwendest. Jede Erklärung ist plausibel.

AKTUALISIEREN

Basierend auf diesem Artikel (in einem Kommentar unten angegeben) würde ich das sagen ist wahrscheinlich ein Problem in der Art, wie Ihre Anwendung synchronisiert (oder nicht).

    
___ answer10236562 ___

Was Sie hier tatsächlich sehen, ist ein Thread, der in eine Endlosschleife geht und %code%

auswertet

Im Wesentlichen

%code%

Dies tritt auf, wenn Sie während einer Umstrukturierung der Tabelle mehrere Threads in eine HashMap einfügen.

Sehen Sie sich diesen Link für weitere Informationen an

Ein schöner Rennzustand

Um dies zu lösen, verwenden Sie entweder %code% oder %code% . Ich schlage das letztere vor.

    
___ antwort10236361 ___

Ist Ihr Hintergrund-Thread in der Anwendungsinstanz synchronisiert, wenn Sie die Komponente ändern? Wenn nicht, dann ist das dein Problem.

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123hashmap ___ Eine Datenstruktur, die eine Hash-Funktion verwendet, um identifizierende Werte, die als Schlüssel bezeichnet werden, ihren zugehörigen Werten zuzuordnen ___ tag123infiniteloop ___ Eine "Endlosschleife" ist eine Schleife, in der die Ausgangskriterien nie erfüllt werden; Eine solche Schleife würde eine potentiell unendliche Anzahl von Iterationen des Schleifenkörpers ausführen. Das allgemeine Problem zu bestimmen, ob die Ausführung einer Schleife mit gegebenen Vorbedingungen zu einer Endlosschleife führt, ist unentscheidbar; Mit anderen Worten, es gibt keinen Algorithmus, um zu bestimmen, ob eine Ausführung einer Schleife schließlich beendet wird. Dies ist bekannt als das Halteproblem. ___ tag123vaadin ___ Vaadin ist ein Client-Server-Framework, das auf GWT (Google Web Toolkit) aufbaut und Java zum Codieren des gesamten Server- und Clientseitencodes verwendet. Vaadin versucht, die clientseitige Präsentationsschicht und den schnellen Anwendungsentwicklungsfaktor gegenüber GWT zu verbessern. ___ qstnhdr ___ Unendliche Schleife in java.util.HashMap ___
Artur 19.04.2012 20:37
quelle

Tags und Links