Maison > Java > javaDidacticiel > le corps du texte

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

Patricia Arquette
Libérer: 2024-11-09 01:56:02
original
257 Les gens l'ont consulté

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;
  }
}
Copier après la connexion

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);
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal