Maison  >  Article  >  Java  >  Pourquoi une « ConcurrentModificationException » se produit-elle malgré l'utilisation de « synchronisé » en Java ?

Pourquoi une « ConcurrentModificationException » se produit-elle malgré l'utilisation de « synchronisé » en Java ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-07 01:32:03920parcourir

Why Does a `ConcurrentModificationException` Occur Despite Using `synchronized` in Java?

ConcurrentModificationException malgré la synchronisation

Dans cet extrait de code :

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

une ConcurrentModificationException est levée malgré l'utilisation du mot-clé synchronisé. Cette exception ne provient généralement pas de problèmes multithread, mais plutôt de modifications apportées à la collection sous-jacente au cours de l'itération.

Dans cet exemple spécifique, l'erreur se produit lors de l'itération dans la collection avec iterator.hasNext() et de la tentative de accéder à un élément avec iterator.next(). Si la collection sous-jacente est modifiée pendant que cette itération est en cours, comme l'ajout ou la suppression d'éléments, cela peut provoquer l'exception ConcurrentModificationException.

La solution consiste à éviter les modifications de la collection pendant l'itération. Ceci peut être réalisé en créant une copie de la collection ou en vérifiant et en gérant explicitement ces modifications dans la boucle d'itération. De plus, si le type de collection prend en charge un ListIterator, cette interface fournit des méthodes supplémentaires pour gérer les insertions et les suppressions pendant l'itération.

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