CopyOnWriteArrayList lanzando CurrentModificationException

Ocasionalmente estoy recibiendo unConcurrentModificationException cuando itero sobre una lista. Una búsqueda en Google me informa que probablemente sea porque estoy modificando esa lista en otro hilo mientras estoy iterando sobre ella y que para que este problema desaparezca, debería usarjava.util.concurrent.CopyOnWriteArrayList....

... excepto que ya estoy.

Al parecer, estoy haciendo algo.De Verdad Estúpido en alguna parte.

¿Alguien tiene alguna idea de cómo se puede inducir?CopyOnWriteArrayList tirar unConcurrentModificationException? Si importa, estoy usando Java 5.

Editar: Ya que los mutadores que estoy usando pueden importar, estoy modificando esta lista de dos maneras:

Añadiendo elementos al frente. (list.add(0, newElement);)Usando subList para dejar que los artículos más viejos se caigan de la espalda. (list = list.subList(0, MAX_LIST_SIZE);)

¿Levantan esas banderas rojas? Si es así, ¿por qué? Mi entendimiento fue que debido a que estas operaciones hacen una copia de la cosa primero, cualquier iterador existente estaría apuntando al original sin modificar y por lo tanto no le importaría. ¿Tengo un agujero en mi conocimiento?

Edición 2: El código exacto que está causando el problema todavía es un poco turbio, pero al menos puedo publicar la excepción que estoy viendo:


java.util.ConcurrentModificationException
    at java.util.concurrent.CopyOnWriteArrayList$COWSubList.checkForComodification(Unknown Source)
    at java.util.concurrent.CopyOnWriteArrayList$COWSubList.iterator(Unknown Source)
    at....

... donde apunta a una instanciación de bucle for-each en mi código.

EseCOWSubList parece implicar que mi llamada asubList es la raíz de mi problema; Todavía me gustaría entender por qué.

Edición 3: * facepalm *

CopyOnWriteArrayList.subList() devuelve unList, no a CopyOnWriteArrayList. La lista que devuelve no tiene ninguna obligación implícita de proporcionar ninguna de las protecciones de COWAL. Lo que hace que usarsubList() Me gusta esto para eliminar elementos de una idea muy mala.

No sé con certeza si este es mi culpable, pero es muy sospechoso y debe corregirse a pesar de todo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta