[Java] explique ConcurrentModificationException qui se produit dans java.util.ArrayList pour les nouveaux arrivants

introduction

ConcurrentModificationException qui se produit également dans un seul thread

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);
		}
	}
}

Quand une ConcurrentModificationException se produit-elle?

Documentation sur Java 8 SE ConcurrentModificationException

Cette exception est levée lorsqu'une méthode qui détecte une modification parallèle dans un objet ne permet pas une telle modification.
Par exemple, il n'est généralement pas autorisé à un autre thread de modifier la collection pendant qu'un thread itère sur la collection.
Dans un tel environnement, les résultats du traitement itératif ne sont généralement pas garantis.
Quelques itérateurs(Iterator)Implémentation de(JREが提供するすべての一般的な目的のコレクションImplémentation deの、イテレータImplémentation deを含む)Est
Vous pouvez choisir de lever cette exception si ce comportement est détecté.
L'itérateur qui lève cette exception est appelé l'itérateur failfast.
Les itérateurs lancent des exceptions immédiatement et gracieusement pour éviter le risque de comportement imprévisible à des moments imprévisibles dans le futur.
Cette exception n'indique pas nécessairement que l'objet n'a pas été mis à jour en parallèle par un autre thread.
L'objet lève cette exception si un seul thread émet un ensemble de méthodes qui violent les conventions de l'objet.
Par exemple, si un thread modifie une collection directement lors de l'itération sur une collection avec un itérateur failfast.
L'itérateur lève cette exception.

Jetez un œil à l'implémentation de java.util.ArrayList

java


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

Avec *, ConcurrentModificationException est levée s'il y a une différence entre expectedModCount et modCount à chaque fois que le curseur se déplace. Vous pouvez deviner le rôle de la propriété à partir du nom.

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

Résumé

Recommended Posts

[Java] explique ConcurrentModificationException qui se produit dans java.util.ArrayList pour les nouveaux arrivants
Ceci et cela pour éditer ini en Java. : inieditor-java
[SQLite] IllegalStateException qui se produit dans Cursor
Notation de version Java qui change dans Java 10
Les débutants jouent à des jeux Janken en Java
[Pour les débutants] Exécutez Selenium sur Java
Paramètres de débogage SSL dans Java
À propos du phénomène que StackOverflowError se produit lors du traitement à l'aide d'expressions régulières Java
Premiers pas pour l'apprentissage profond en Java
Points clés pour l'introduction de gRPC en Java
ERRORCODE = -4471 se produit dans une application Java qui utilise Db2.
[Java] Pourquoi aucune erreur de compilation ne se produit pour les classes qui n'implémentent pas Comparable
java qui génère un fichier au format vmg au format eml
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Techniques de lecture du code source Java dans Eclipse
La solution pour NetBeans 8.2 ne fonctionne pas dans l'environnement Java 9
Un fichier bat qui utilise Java dans Windows
Définissez un affichage contextuel pour le langage Java avec vim.
Classe StringConverter à usage général qui utilise des génériques dans Java8
Comparez la sortie PDF en Java pour les tests d'instantanés
Activer / désactiver SNI en Java pour chaque communication
Points à connaître avec Java Equals