2011-05-01 28 views

Respuesta

30

El comportamiento de List.iterator() no está definido o es coherente con las diferentes implementaciones de List.

Para ArrayList, LinkedList, puede obtener una ConcurrentModificationException si la lista se modifica cuando está iterando sobre ella. (Esto no está garantizado) La forma de evitar este problema es usar una synchronizedList() y bloquear la lista mientras se itera sobre ella.

Para Vector, la colección está sincronizada, pero el iterador no es seguro para subprocesos.

Para CopyOnWriteArrayList, obtiene una instantánea de los elementos de la lista en el momento en que llama a iterator(), este iterador es seguro para subprocesos y no necesita usar ningún bloqueo. Nota: el contenido de los elementos puede cambiar.

7

Ningún iterador es seguro para subprocesos. Si la colección subyacente se cambia en medio de la iteración, se lanza un ConcurrentModificationException.

Incluso los iteradores de colecciones sincronizadas no son seguros para subprocesos: tiene que sincronizar manualmente.

Una excepción es CopyOnWriteArrayList, que contiene una instantánea durante la iteración.

+2

"Ningún iterador es seguro para subprocesos excepto uno" podría haberse escrito como "Todos son seguros para subprocesos, excepto dos o tres";) –

+0

Si la colección subyacente se cambia durante la iteración por otra cadena, CME puede lanzarse o no arrojado, ya que el contador de modificación interna no es atómico. – Anton

Cuestiones relacionadas