[Java] Erläutert die ConcurrentModificationException, die in java.util.ArrayList für Neulinge auftritt

Einführung

ConcurrentModificationException, die auch in einem einzelnen Thread auftritt

DenaiConcurrentModificationException.java


public static void main(String[] args) {
	List<String> list = new ArrayList<String>();
	
	list.add("A");
	list.add("B");
	list.add("C");
	list.add("D");
	
	for (String str : list) {
		if ("C".equals(str)) {
			list.remove(str);
		} else {
			System.out.println(str);
		}
	}
}

DeruConcurrentModificationException.java


public static void main(String[] args) {
	List<String> list = new ArrayList<String>();
	
	list.add("A");
	list.add("B");
	list.add("C");
	list.add("D");
	list.add("E");
	
	for (String str : list) {
		if ("C".equals(str)) {
			list.remove(str);
		} else {
			System.out.println(str);
		}
	}
}

Wann tritt eine ConcurrentModificationException auf?

Java 8 SE ConcurrentModificationException-Dokumentation

Diese Ausnahme wird ausgelöst, wenn eine Methode, die eine parallele Änderung in einem Objekt erkennt, eine solche Änderung nicht zulässt.
Beispielsweise ist es im Allgemeinen nicht zulässig, dass ein anderer Thread die Sammlung ändert, während ein Thread die Sammlung durchläuft.
In einer solchen Umgebung sind die Ergebnisse der iterativen Verarbeitung normalerweise nicht garantiert.
Einige Iteratoren(Iterator)Implementierung von(JREが提供するすべての一般的な目的のコレクションImplementierung vonの、イテレータImplementierung vonを含む)Ist
Sie können diese Ausnahme auslösen, wenn dieses Verhalten erkannt wird.
Der Iterator, der diese Ausnahme auslöst, wird als ausfallsicherer Iterator bezeichnet.
Iteratoren lösen sofort und ordentlich Ausnahmen aus, um das Risiko unvorhersehbaren Verhaltens an unvorhersehbaren Punkten in der Zukunft zu vermeiden.
Diese Ausnahme bedeutet nicht unbedingt, dass das Objekt nicht parallel von einem anderen Thread aktualisiert wurde.
Das Objekt löst diese Ausnahme aus, wenn ein einzelner Thread eine Reihe von Methoden ausgibt, die gegen die Konventionen des Objekts verstoßen.
Wenn beispielsweise ein Thread eine Sammlung direkt ändert, während er mit einem ausfallsicheren Iterator über eine Sammlung iteriert.
Der Iterator löst diese Ausnahme aus.

Schauen Sie sich die Implementierung von java.util.ArrayList an

java


/**
 * An optimized version of AbstractList.Itr
 */
private class Itr implements Iterator<E> {}

Mit * wird die ConcurrentModificationException ausgelöst, wenn bei jeder Bewegung des Cursors ein Unterschied zwischen expectedModCount und modCount besteht. Sie können die Rolle der Eigenschaft anhand des Namens erraten.

java


final void checkForComodification() {
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

java


/*
 * Private remove method that skips bounds checking and does not
 * return the value removed.
 */
private void fastRemove(int index) {
    modCount++;
    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--size] = null; // clear to let GC do its work
}

skitch.3.png skitch.4.png

Zusammenfassung

Recommended Posts

[Java] Erläutert die ConcurrentModificationException, die in java.util.ArrayList für Neulinge auftritt
Dies und das zum Bearbeiten von ini in Java. : inieditor-java
[SQLite] IllegalStateException, die im Cursor auftritt
Java-Versionsnotation, die sich in Java 10 ändert
Anfänger spielen Janken-Spiele in Java
[Für Anfänger] Führen Sie Selenium auf Java aus
Einstellungen für das SSL-Debugging in Java
Über das Phänomen, dass StackOverflowError bei der Verarbeitung mit regulären Java-Ausdrücken auftritt
Erste Schritte für tiefes Lernen in Java
Wichtige Punkte für die Einführung von gRPC in Java
ERRORCODE = -4471 tritt in einer Java-Anwendung auf, die Db2 verwendet.
[Java] Warum kein Kompilierungsfehler für Klassen auftritt, die Comparable nicht implementieren
Java, das eine Datei im Vmg-Format im EML-Format ausgibt
ChatWork4j für die Verwendung der ChatWork-API in Java
Techniken zum Lesen von Java-Quellcode in Eclipse
Lösung für NetBeans 8.2 funktioniert nicht in Java 9-Umgebung
Eine Bat-Datei, die Java in Windows verwendet
Stellen Sie mit vim die Popup-Anzeige für die Java-Sprache ein.
Allzweck-StringConverter-Klasse, die Generika in Java8 verwendet
Vergleichen Sie die PDF-Ausgabe in Java für Snapshot-Tests
Aktivieren / Deaktivieren von SNI in Java für jede Kommunikation
Punkte, die bei Java beachtet werden müssen, sind gleich