questions interview interfaces example characteristics java collections

interview - java collections java



¿En qué situaciones es adecuada la CopyOnWriteArrayList? (2)

Esta pregunta ya tiene una respuesta aquí:

Estoy aprendiendo acerca de la clase CopyOnWriteArrayList .

  • ¿Cuál es el propósito de copiar una nueva matriz?
  • ¿Es para que otros hilos lean la matriz?

Entonces, si un sistema tiene una concurrencia alta y la mayoría de las acciones de los hilos no están leyendo, es mejor usar CopyOnWriteArrayList .


¿Cuál es el propósito de hacer frente a una nueva matriz?

Copiar la matriz subyacente garantiza que cualquier iteración de la estructura de datos es segura ya que la iteración ocurre sobre una "instantánea" esencialmente inmutable de los datos.

¿Es para que otros hilos lean la matriz?

Más o menos Más específicamente, es para cada hilo poder iterar de forma segura la matriz sin temor a una ConcurrentModificationException u otro comportamiento desconocido / indefinido.

Entonces, si un sistema tiene alta concurrencia y la mayoría de las acciones de los hilos no son de lectura, es mejor usar CopyOnWriteArrayList. ¿Estoy en lo cierto?

No. Solo si la mayoría de las acciones de los hilos son iteraciones sobre la lista. Si la mayoría de las actividades son lecturas basadas en el acceso aleatorio, un ReadWriteLock podría ser mejor.

Del javadoc de CopyOnWriteArrayList

Esto es generalmente demasiado costoso, pero puede ser más eficiente que las alternativas cuando las operaciones de cruce superan con creces a las mutaciones, y es útil cuando no puede o no desea sincronizar los cruces , pero necesita evitar la interferencia entre hilos concurrentes.


Como se indica en este link :

CopyOnWriteArrayList es una clase de colección concurrente presentada en la API de simultaneidad de Java 5 junto con su primo popular ConcurrentHashMap en Java.

CopyOnWriteArrayList implementa una interfaz de lista como ArrayList, Vector y LinkedList, pero es una colección segura para subprocesos y logra su seguridad de subprocesos de una manera ligeramente diferente a la de Vector u otra clase de colección de subprocesos.

Como su nombre indica, CopyOnWriteArrayList crea una copia de ArrayList subyacente con cada operación de mutación, por ejemplo, agregar o establecer. Normalmente CopyOnWriteArrayList es muy costoso porque implica costosas copias de Array con cada operación de escritura, pero es muy eficiente si tiene una Lista donde la Iteración supera en número a la mutación, por ejemplo, necesita iterar la ArrayList y no la modifica con demasiada frecuencia.

El iterador de CopyOnWriteArrayList es a prueba de errores y no emite ConcurrentModificationException incluso si el subyacente CopyOnWriteArrayList se modifica una vez que comienza la iteración porque Iterator está operando en una copia separada de ArrayList. En consecuencia, todas las actualizaciones realizadas en CopyOnWriteArrayList no están disponibles para Iterator.

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

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