Ist Ihr Hintergrund-Thread in der Anwendungsinstanz synchronisiert, wenn Sie die Komponente ändern? Wenn nicht, dann ist das dein Problem.
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.
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).
Was Sie hier tatsächlich sehen, ist ein Thread, der in eine Endlosschleife geht und e = e.next
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
Um dies zu lösen, verwenden Sie entweder Collections.synchronizedMap
oder ConcurrentHashMap
. Ich schlage das letztere vor.
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.
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).
Was Sie hier tatsächlich sehen, ist ein Thread, der in eine Endlosschleife geht und %code%
auswertetIm 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
Um dies zu lösen, verwenden Sie entweder %code% oder %code% . Ich schlage das letztere vor.
Ist Ihr Hintergrund-Thread in der Anwendungsinstanz synchronisiert, wenn Sie die Komponente ändern? Wenn nicht, dann ist das dein Problem.
Tags und Links java infinite-loop hashmap vaadin