ConcurrentModificationException trotz Synchronisierung
In diesem Codeausschnitt:
public synchronized X getAnotherX() { if (iterator.hasNext()) { X b = iterator.next(); String name = b.getInputFileName(); ... return b; } else { return null; } }
eine ConcurrentModificationException wird trotz der Verwendung von geworfen synchronisiertes Schlüsselwort. Diese Ausnahme entsteht normalerweise nicht durch Multithreading-Probleme, sondern durch Änderungen an der zugrunde liegenden Sammlung während der Iteration.
In diesem speziellen Beispiel tritt der Fehler auf, wenn mit iterator.hasNext() durch die Sammlung iteriert wird und dies versucht wird Greifen Sie mit iterator.next() auf ein Element zu. Wenn die zugrunde liegende Sammlung während dieser Iteration geändert wird, beispielsweise durch das Hinzufügen oder Entfernen von Elementen, kann dies die ConcurrentModificationException verursachen.
Die Lösung besteht darin, Sammlungsänderungen während der Iteration zu vermeiden. Dies kann erreicht werden, indem eine Kopie der Sammlung erstellt wird oder indem diese Änderungen innerhalb der Iterationsschleife explizit überprüft und verarbeitet werden. Wenn der Sammlungstyp außerdem einen ListIterator unterstützt, stellt diese Schnittstelle zusätzliche Methoden zum Verwalten von Einfügungen und Entfernungen während der Iteration bereit.
Das obige ist der detaillierte Inhalt vonWarum tritt trotz der Verwendung von „synchronized“ in Java eine „ConcurrentModificationException“ auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!