Maison  >  Article  >  Java  >  Comment gérer ConcurrentModificationException en Java ?

Comment gérer ConcurrentModificationException en Java ?

王林
王林original
2023-06-25 08:31:431694parcourir

Comment gérer ConcurrentModificationException en Java ?

En programmation Java, ConcurrentModificationException est une exception très courante. Cette exception se produit souvent lorsque nous utilisons un itérateur (Iterator) ou une boucle for améliorée (foreach) pour parcourir une collection. Cet article présentera la cause et la solution de cette exception.

  1. Cause d'exception

Lorsque nous utilisons un itérateur pour parcourir une collection, si les éléments de la collection sont modifiés (ajoutés, supprimés, etc.) pendant le processus de traversée, une exception ConcurrentModificationException sera levée. La raison de cette exception est que lorsque la méthode next() de Iterator est appelée, elle comparera si le modCount actuel est égal à ExpectModCount. S'il n'est pas égal, cela signifie que la collection a changé au cours du processus d'itération, c'est-à-dire. , lorsque nous ajoutons ou supprimons un élément de collection, la valeur de modCount sera modifiée, mais la valeur de ExpectedModCount ne changera pas, ce qui rendra les deux inégaux, et une exception ConcurrentModificationException sera levée.

  1. Solution

Afin d'éviter l'apparition de ConcurrentModificationException, nous devons éviter de modifier les éléments de la collection lors de la traversée de la collection. De manière générale, il existe trois solutions :

(1) Utiliser une boucle for ordinaire pour parcourir

.

Utiliser une boucle for normale pour parcourir est une solution réalisable car nous pouvons opérer sur les éléments de la collection via des indices au lieu d'utiliser des itérateurs. Cependant, cette méthode est plus délicate à utiliser et nécessite une plus grande quantité de code.

Exemple de code :

List<String> list = new ArrayList<>();
for(int i = 0; i < list.size(); i++) {
    String str = list.get(i);
    // 对str进行操作
}

(2) Utilisez la méthode de suppression d'Iterator

Si nous devons modifier des éléments lors du parcours de la collection, nous pouvons utiliser la méthode de suppression d'Iterator pour effectuer l'opération de suppression. Cette méthode peut être utilisée pour supprimer l'élément renvoyé par le dernier appel à la méthode next() sans lancer ConcurrentModificationException.

Exemple de code :

List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String str = it.next();
    if(str.equals("hello")) {
        it.remove();
    }
}

(3) Utilisation de CopyOnWriteArrayList

CopyOnWriteArrayList est une collection thread-safe. Sa fonction de séparation en lecture-écriture garantit que lorsque nous ajoutons ou supprimons des éléments à la collection, cela n'affectera pas le thread de parcours en cours. . Lorsqu'un élément change, CopyOnWriteArrayList crée une nouvelle copie des données et opère ensuite dessus. Par conséquent, CopyOnWriteArrayList convient aux scénarios dans lesquels il y a plus de lecture et moins d’écriture.

Exemple de code :

List<String> list = new CopyOnWriteArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String str = it.next();
    if(str.equals("hello")) {
        list.remove(str);
    }
}

Les méthodes ci-dessus sont les méthodes courantes que nous utilisons pour éviter les exceptions ConcurrentModificationException. Dans la programmation réelle, afin de garantir la robustesse et l'efficacité du programme, nous devons sélectionner des méthodes basées sur la situation réelle.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn