Comment résoudre l'exception de modification simultanée Java (ConcurrentModificationException)
En programmation Java, lorsque plusieurs threads modifient un objet de classe de collection en même temps, il est facile de provoquer une exception "ConcurrentModificationException". Cet article décrit la cause de l’exception et fournit diverses solutions et exemples de code.
1. Cause de l'exception
1.1 Structure de la classe de collection
L'exception ConcurrentModificationException se produit généralement dans les classes de collection basées sur un itérateur, telles que ArrayList, HashMap, etc. Ils utilisent une variable modCount en interne pour enregistrer le nombre de fois que la collection a été modifiée.
1.2 Modification simultanée
Lorsqu'un thread effectue une opération itérative, un autre thread ajoute, supprime ou modifie la collection, modifiant ainsi la valeur de modCount, faisant penser à l'itérateur que la collection a été modifiée, puis lançant une exception ConcurrentModificationException .
2. Solution
2.1 Utilisez la méthode Remove de l'itérateur
L'itérateur de la classe de collection Java fournit la méthode Remove, qui peut supprimer en toute sécurité l'élément actuellement itéré de la collection.
List<String> list = new ArrayList<>(); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); if (condition) { iterator.remove(); } }
2.2 Utilisation de classes de collection simultanées
Le package de concurrence Java (java.util.concurrent) fournit une série de classes de collection thread-safe, qui utilisent toutes différents mécanismes de concurrence pour résoudre le problème de la modification simultanée.
Par exemple, utilisez ConcurrentHashMap au lieu de HashMap :
import java.util.concurrent.ConcurrentHashMap; ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>(); map.put("key1", "value1"); map.put("key2", "value2"); for (Map.Entry<String, String> entry : map.entrySet()) { if (condition) { map.remove(entry.getKey()); } }
2.3 Utiliser le mécanisme de synchronisation
Utilisez le mot-clé synchronisé pour synchroniser la collection afin de garantir qu'un seul thread peut accéder à la collection en même temps, évitant ainsi les exceptions de modification simultanées.
List<String> list = new ArrayList<>(); synchronized (list) { for (String element : list) { if (condition) { list.remove(element); } } }
2.4 Utilisation de CopyOnWriteArrayList
CopyOnWriteArrayList est une classe de collection thread-safe qui crée une nouvelle copie de collection lors des opérations d'écriture (ajout, suppression, modification), évitant ainsi les exceptions de modification simultanées.
import java.util.concurrent.CopyOnWriteArrayList; CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("item1"); list.add("item2"); for (String element : list) { if (condition) { list.remove(element); } }
3. Résumé
L'exception de modification simultanée Java (ConcurrentModificationException) est causée par plusieurs threads modifiant des objets de classe de collection en même temps. Afin de résoudre ce problème, vous pouvez utiliser la méthode Remove de l'itérateur, la classe de collection simultanée, le mécanisme de synchronisation ou CopyOnWriteArrayList et d'autres méthodes. Choisissez une méthode appropriée en fonction de la situation réelle pour résoudre les exceptions de modifications simultanées et garantir la stabilité et la fiabilité du programme.
4. Références
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!