2010-11-19 4 views
14

Javadocs de CopyOnWriteArrayList diceComportamiento de CopyOnWriteArrayList

Una variante thread-safe de ArrayList en el que todas las operaciones mutativas (añadir, ajuste, y así sucesivamente) se implementan haciendo una copia fresca de la matriz subyacente .

Estoy confundido ahora cuando verán los otros cambios los cambios presentes en esta nueva copia? ¿Significa esto que habrá un número de copias de la matriz subyacente igual al número de mutaciones de la colección? Si no es así, ¿cuándo se transfieren los cambios de estas copias individuales al conjunto subyacente para que otros hilos puedan verlos?

Respuesta

17

La idea aquí es que cada vez que agrega o elimina al CopyOnWriteArrayList, la matriz subyacente se copia básicamente con la modificación.

¿Quiere esto decir que habrá varios copias de la matriz subyacente iguales al número de mutaciones de la colección

Sí, para todos los hilos que actualiza los ArrayList todos los otros hilos sosteniendo una copia anterior en esencia hará referencia a una matriz diferente.

cuando están los cambios de estos copias individuales se transfieren a matriz subyacente de manera que otros hilos pueden verlos?

Una matriz que está buscando actualmente (digamos que su iterador) nunca cambiará. Cuando lees de una matriz, la estás leyendo como estaba cuando comenzaste a leer. Si el CopyOnWriteArrayList cambia por otro hilo, la matriz que está observando actualmente no se verá afectada.

Para obtener la versión más actualizada hacer una nueva lectura como list.iterator();

Dicho esto, la actualización de esta colección mucho matará rendimiento. Si trataste de ordenar un CopyOnWriteArrayList verás que la lista arroja un UsupportedOperationException (el conjunto de invocaciones de ordenación en la colección N veces). Solo debe usar esta lectura cuando realice lecturas superiores al 90%.