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!