Comment déboguer ConcurrentModificationException?
J'ai rencontré ConcurrentModificationException et en les regardant, je ne vois pas la raison pourquoi il se passe; la zone de jeter de l'exception et de tous les lieux de modifier la collection sont entourés par
synchronized (this.locks.get(id)) {
...
} //locks is a HashMap<String, Object>;
J'ai essayé de rattraper le agaçants fil, mais tout ce que je pouvais clou (en mettant un point d'arrêt dans l'exception), c'est que le fait de lancer thread possède le moniteur tandis que l'autre thread (il y a deux fils dans le programme) dort.
Comment dois-je procéder? Que faites-vous habituellement lorsque vous rencontrez similaire problèmes de threading?
Double Possible de l'Itération sur une Collection, en évitant ConcurrentModificationException lors de la suppression de la boucle
OriginalL'auteur Dani | 2009-05-08
Vous devez vous connecter pour publier un commentaire.
Il peut n'avoir rien à faire avec le bloc de synchronisation.
ConcurrentModificationException
s souvent se produire lorsque vous modifiez une collection tout en vous une itération sur les éléments.OriginalL'auteur Adam Paynter
Semblable à un post précédent, vous pouvez obtenir le même problème si vous supprimez une entrée.
par exemple,
Un autre exemple courant est le nettoyage d'une Carte.
Ce problème peut être résolu en utilisant un Itérateur explicitement.
L'avez-vous résolu votre problème? Comment?
J'ai utilisé CopyOnWriteArray après des tests de performance et la recherche de la performance n'est pas mauvaise pour nos besoins. Dans quelques endroits où nous sommes allés avec le toRemoveSet solution iftee mentionne.
J'ai aussi découvert que certains de la collection iterator() la méthode fournit un itérateur "affichage" de la liste d'origine, c'est pourquoi j'étais encore en train de l'erreur.
Autant que je sache, c'est toujours de fournir une vue plutôt une copie. pour CopyOnWriteArrayXxx il réalise la copie lorsqu'il est modifié, et l'itérateur voit l'original.
OriginalL'auteur Peter Lawrey
Parfois, votre demande peut être complexe, trop complexe et certaines fonctions peuvent avoir trop d'effets secondaires. Aussi, peut-être un autre thread est vraiment en train de faire quelque chose de mal avec cette liste et vous ne pouvez pas trouver où facilement.
Pour mon problème, j'ai écris mon propre système de liste aux délégués une autre liste et, une fois verrouillé, toutes les autres modifications jette ConcurrentModificationException, de sorte que la mauvaise modification d'instruction à la sortie avec l'exception. Il peut également détecter les erreurs décrites ci-dessus.
Il suffit de l'utiliser comme ceci :
Espère que ça peut aider quelqu'un d'autre.
OriginalL'auteur Béatrice Cassistat
si vous avez besoin de supprimer quelques éléments de votre liste. Vous pouvez maintenir une liste des éléments à être supprimé. Et enfin appeler removeAll(collection). Bien sûr, ce n'est pas bon pour les grandes quantités de données.
OriginalL'auteur iftee
Ayant eu à traiter avec des problèmes similaires, j'ai écrit une petite aide pour déboguer l'accès simultané de situations, de certains objets (parfois à l'aide d'un débogueur modifie le comportement d'exécution tant que le problème ne se produit pas). L'approche est similaire à celle de François l'a montré, mais un peu plus générique. Peut-être que ça aide quelqu'un: http://code.google.com/p/kongcurrent/
OriginalL'auteur JanDasWiesel
Il est courant de recevoir un ConcurrentModificationException lors de la modification d'une liste dynamique lors de l'itération sur elle (dans un foreach-boucle par exemple). Vous voulez vous assurer que vous ne faites pas cela partout.
OriginalL'auteur Lucas Lindström