Otras respuestas han identificado el problema:
Los iteradores para colecciones sincronizadas no están sincronizados. De hecho, son simplemente los iteradores devueltos por los objetos de colección dentro de las clases contenedoras.
Muchas clases de recopilación (incluido ArrayList
) utilizan un mecanismo de recuperación para detectar modificaciones concurrentes durante la iteración. Este comportamiento está claramente documentado en los javadocs para las clases respectivas. Esto es lo que estás viendo.
No todas las clases de colecciones hacen esto.Por ejemplo, muchas de las clases de recopilación java.util.Concurrent...
permiten la modificación concurrente durante la iteración, pero relajan la semántica de la secuencia de iteración para que los resultados de las modificaciones puedan o no ser aparentes en los objetos devueltos por el iterador.
El javadoc para Collections.synchronizedList()
explica cómo sincronizar el iterador. Básicamente lo que hace esto:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
(Aparte: normalmente no es seguro asumir que hacer algo como esto funcionaría En teoría, la lista sincronizada podría utilizar un objeto de bloqueo privada, y la declaración synchronized
no cerraba. Sin embargo, los javadocs dicen que esto es lo que hay que hacer en este caso ... por lo que es seguro.
El problema al hacerlo es que al bloquear la colección se crea un posible cuello de botella de concurrencia. La alternativa es usar una estructura de datos de copia sobre escritura que internamente haga una copia de las partes relevantes de la colección. Este enfoque significa que un iterador ve una instantánea de la colección. Se pueden hacer modificaciones a la colección simultáneamente con una iteración, pero el iterador no las ve. El problema con el copy-on-write es que las modificaciones son potencialmente mucho más costosas.
En última instancia, debe equilibrar las características y los costos de los diferentes tipos de recopilación con modificaciones simultáneas en comparación con sus necesidades reales. ¿Puede salirse con la suya sin ver todas las modificaciones concurrentes?
puedo conseguir el punto de que no puedo utilizar para acceder al repetidor arrayList sincronizada. – Lalchand