Wie zum Beispiel Container Map in Java:
for(Person person : pList){
if(person.getGender()==Gender.MALE){
pList.remove(person); // Der Entfernungsvorgang kann während des Durchlaufs nicht ausgeführt werden
}
}
Beim Durchlaufen einer Karte erhält es normalerweise den Satz seiner Schlüsselwerte und verwendet dann einen Iterator zum Durchlaufen der Karte.
Beachten Sie, dass während des Durchlaufvorgangs nur die Elemente in der Karte entsprechend verarbeitet werden können. Mit anderen Worten, die Größe der Karte kann nicht geändert werden und es tritt eine Ausnahme auf (kann während des Durchlaufs nicht verwendet werden). Durchlaufprozess). Elemente in der Karte ändern, löschen oder hinzufügen.
Die gemeldete Ausnahme ist die Ausnahme java.util.ConcurrentModificationException
öffentliche Klasse ConcurrentModificationExceptionextends RuntimeException
Diese Ausnahme wird ausgelöst, wenn eine Methode gleichzeitige Änderungen an einem Objekt erkennt, diese Änderungen jedoch nicht zulässt.
Während beispielsweise ein Thread eine Sammlung durchläuft, ist es einem anderen Thread normalerweise nicht gestattet, die Sammlung linear zu ändern. In diesen Fällen sind die Ergebnisse der Iteration häufig unklar. Einige Iteratorimplementierungen (einschließlich aller von der JRE bereitgestellten generischen Sammlungsimplementierungen) lösen diese Ausnahme möglicherweise aus, wenn dieses Verhalten erkannt wird. Iteratoren, die diesen Vorgang ausführen, werden als Fail-Fast-Iteratoren bezeichnet, da der Iterator völlig schnell ausfällt, ohne dass das Risiko eines willkürlichen, nicht spezifizierten Verhaltens zu einem späteren Zeitpunkt besteht.
Beachten Sie, dass diese Ausnahme nicht immer darauf hinweist, dass das Objekt gleichzeitig von verschiedenen Threads geändert wurde. Ein Objekt kann diese Ausnahme auslösen, wenn ein einzelner Thread eine Folge von Methodenaufrufen ausgibt, die gegen den Vertrag des Objekts verstoßen. Wenn beispielsweise ein Thread eine Sammlung direkt ändert, während er mit einem Fail-Fast-Iterator darüber iteriert, löst der Iterator diese Ausnahme aus.
Beachten Sie, dass das Fail-Fast-Verhalten von Iteratoren nicht garantiert ist, da es im Allgemeinen nicht möglich ist, feste Garantien dafür zu geben, ob nicht synchronisierte gleichzeitige Änderungen auftreten. Fail-Fast-Vorgänge lösen auf Best-Effort-Basis eine ConcurrentModificationException aus. Daher ist es ein Fehler, ein Programm zu schreiben, das auf dieser Ausnahme basiert, um die Korrektheit solcher Vorgänge zu verbessern. Der richtige Ansatz ist: ConcurrentModificationException sollte nur zum Erkennen von Fehlern verwendet werden.
Wenn Sie versuchen, den Inhalt einer Sammlung/Map direkt zu ändern und dabei einen Fail-Fast-Iterator zum Durchlaufen einer Sammlung oder Map verwenden, wird eine java.util.ConcurrentModificationException-Ausnahme ausgelöst, selbst wenn die Ausführung unter einem einzelnen Thread erfolgt.
Iterator arbeitet in einem separaten Thread und verfügt über eine Mutex-Sperre. Nachdem der Iterator erstellt wurde, wird eine einfach verknüpfte Indextabelle erstellt, die auf das Originalobjekt zeigt. Wenn sich die Anzahl der Originalobjekte ändert, ändert sich der Inhalt dieser Indextabelle nicht synchron. Wenn sich der Indexzeiger also rückwärts bewegt, ist dies nicht möglich Es muss ein zu iterierendes Objekt gefunden werden, sodass Iterator gemäß dem Fail-Fast-Prinzip sofort eine java.util.ConcurrentModificationException-Ausnahme auslöst.
Daher lässt der Iterator nicht zu, dass das iterierte Objekt während der Arbeit geändert wird. Sie können jedoch die Iterator-eigene Methode „remove()“ verwenden, um Objekte zu löschen. Die Methode „Iterator.remove()“ löscht das aktuelle Iterationsobjekt und behält dabei die Konsistenz des Index bei.
Interessant ist, dass die ConcurrentModificationException-Ausnahme nicht ausgelöst wird, wenn Ihr Sammlungs-/Kartenobjekt tatsächlich nur ein Element enthält. Aus diesem Grund wird im Javadoc darauf hingewiesen: Es wäre falsch, ein Programm zu schreiben, dessen Richtigkeit von dieser Ausnahme abhängt: ConcurrentModificationException sollte nur zum Erkennen von Fehlern verwendet werden.