Maison  >  Article  >  Java  >  Pourquoi est-ce que j'obtiens une exception ConcurrentModificationException même lorsque j'utilise « synchronisé » ?

Pourquoi est-ce que j'obtiens une exception ConcurrentModificationException même lorsque j'utilise « synchronisé » ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-09 01:56:02231parcourir

Why Do I Get ConcurrentModificationException Even When Using `synchronized`?

Comment puis-je obtenir une exception ConcurrentModificationException malgré l'utilisation de Synchronized ?

Il est courant de supposer que l'utilisation du mot clé synchronisé évite tous les problèmes de concurrence. Cependant, cela garantit uniquement qu’un thread à la fois peut accéder à un bloc de code synchronisé. Cela n'empêche pas les modifications de la collection d'être itérées.

Considérez le code suivant :

public synchronized X getAnotherX() {
  if (iterator.hasNext()) {
    X b = iterator.next();
    String name = b.getInputFileName();
    ...
    return b;
  } else {
    return null;
  }
}

L'en-tête de déclaration synchronisé garantit uniquement que la méthode entière est exécutée par un thread à la fois. temps. Cependant, cela n'empêche pas la collection à laquelle l'itérateur accède d'être modifiée par d'autres threads.

Pourquoi ConcurrentModificationException se produit-elle ?

ConcurrentModificationException se produit généralement lorsque vous modifiez la collection étant itérée dans la boucle d'itération. Par exemple, le code suivant provoquera cette exception :

Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
    Item item = (Item) iterator.next();
    if (item.satisfiesCondition()) {
        collection.remove(item);
    }
}

Dans ce cas, vous devez plutôt utiliser la méthode iterator.remove() pour supprimer des éléments. Si vous devez ajouter des éléments à la collection, vous ne pouvez pas compter sur des méthodes synchronisées. Cependant, si vous avez affaire à une liste, vous pouvez utiliser le sous-type ListIterator, qui fournit une méthode add().

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