En una aplicación de subprocesos múltiples en la que estoy trabajando, ocasionalmente vemos ConcurrentModificationExceptions
en nuestras listas (que en su mayoría son ArrayList
, a veces vectores). Pero hay otras veces en las que creo que ocurren modificaciones concurrentes porque parece que la iteración a través de la colección está perdiendo elementos, pero no se lanzan excepciones. Sé que los documentos para ConcurrentModificationException
dicen que no puedes confiar en él, pero ¿cómo me aseguraré de no modificar una Lista al mismo tiempo? ¿Y está envolviendo cada acceso a la colección en un bloque sincronizado la única manera de prevenirlo?¿Detecta modificaciones concurrentes?
Actualización: Sí, sé de Collections.synchronizedCollection
, pero no protege contra que alguien modifique la colección mientras la itera. Creo que al menos parte de mi problema está sucediendo cuando alguien agrega algo a una colección mientras lo estoy recorriendo.
Segundo informe de actualización Si alguien quiere combinar la mención de la synchronizedCollection y la clonación como Jason hizo con una mención de la java.util.concurrent y las colecciones marcos Apache como jacekfoo y Javamann hizo, puede aceptar una respuesta.
RE descarga: una combinación del uso de una colección sincronizada y la duplicación de contenido de la lista antes iterar es necesario. –
Jason, sí veo eso ahora. Si agregara una mención de CopyOnWriteArrayList a su respuesta, la aceptaría. –
¿Es importante que cuando esté iterando, la versión "en vivo" de la lista no se modifique, o puede iterar sobre una copia posiblemente obsoleta? Creo que también puede haber un problema de diseño (¿quién controla el acceso a la lista?), Junto con el uso de sincronización y java.util.concurrent. –