Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Colección CopyOnWrite | Colecciones Sincronizadas
Multithreading en Java

bookColección CopyOnWrite

Hemos explorado muchas colecciones sincronizadas juntos, y si ya has dominado las demás, encontrarás que esta es aún más sencilla.

Ejemplo de la vida real

Una aplicación web que utiliza CopyOnWriteArrayList para almacenar suscriptores de eventos. Varios hilos pueden recuperar simultáneamente una lista de suscriptores actuales para notificarlos sobre cambios, mientras que otros hilos pueden agregar o eliminar suscriptores.

Diferencias con otros tipos

Las colecciones CopyOnWrite crean una copia de la colección cada vez que se realiza un cambio, lo que garantiza que las operaciones de lectura no se bloqueen por cambios en los datos, proporcionando así seguridad de hilos para las lecturas, aunque las operaciones de escritura no son seguras para hilos ya que se realizan sobre una copia separada de la colección.

Vistas CopyOnWrite:

Note
Nota

Como se puede observar en la imagen, al agregar un nuevo elemento, se realiza una copia de esta estructura de datos; todos los hilos que trabajaban con esta colección antes de su modificación continuarán su trabajo sin inconvenientes, ya que estos cambios no afectarán a la copia CopyOnWrite que utilizan.

CopyOnWriteArraySet

CopyOnWriteArraySet es una implementación de conjunto segura para hilos basada en CopyOnWriteArrayList. Garantiza la seguridad en la concurrencia creando una nueva copia del conjunto base cada vez que ocurre un cambio, como agregar o eliminar elementos.

Este enfoque es especialmente útil cuando el conjunto se lee con frecuencia y se modifica rara vez, ya que proporciona una vista consistente del conjunto para todos los hilos sin requerir sincronización.

CopyOnWriteArrayList

CopyOnWriteArrayList es una variante de ArrayList segura para hilos que garantiza la seguridad en la concurrencia creando una nueva copia del array subyacente cada vez que se modifica.

Este diseño ofrece un iterador tolerante a fallos que no lanza una ConcurrentModificationException porque opera sobre una instantánea del array tomada en el momento en que se creó el iterador. Es más adecuado para situaciones donde las operaciones de lectura son significativamente más frecuentes que las operaciones de escritura, ya que la sobrecarga de copiar todo el array en cada escritura puede ser considerable.

Ejemplo práctico de caso de uso

Métodos de la colección CopyOnWrite

addIfAbsent(E e): Agrega un elemento a la lista solo si aún no está presente en la lista/múltiple.

Main.java

Main.java

copy
123456789101112131415161718192021
package com.example; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); // Attempt to add a duplicate element list.addIfAbsent("apple"); // This will not add "apple" again // Adding a new element list.addIfAbsent("orange"); // This will add "orange" System.out.println(list); // Output: [apple, banana, orange] } }

En este ejemplo, "apple" no se agrega de nuevo porque ya existe en la lista. El método addIfAbsent() previene entradas duplicadas, manteniendo la unicidad de los elementos.

addAllAbsent(Collection<? extends E> c): Agrega todos los elementos de la colección especificada a la lista/conjunto, ignorando los elementos que ya existen.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); List<String> newFruits = Arrays.asList("banana", "cherry", "date"); // Adding elements from the collection, ignoring duplicates list.addAllAbsent(newFruits); System.out.println(list); // Output: [apple, banana, cherry, date] } }

En este ejemplo, "banana" ya está presente en la lista, por lo que addAllAbsent() no la añadirá de nuevo. El método garantiza que solo los elementos únicos de la colección proporcionada se agreguen a la lista.

Note
Nota

Todos los demás métodos de las colecciones CopyOnWrite son similares a los de sus colecciones padre; simplemente copian el estado de la colección cada vez que se realizan cambios.

Limitaciones y Ventajas

😔Limitaciones:

Las colecciones CopyOnWrite presentan limitaciones notables. Suponen un costo de memoria debido a la creación de una nueva copia de la colección cada vez que se realiza un cambio, lo cual puede ser considerable. Este diseño las hace menos adecuadas para escenarios donde se requieren cambios frecuentes en los datos.

💪Ventajas:

Por otro lado, las colecciones CopyOnWrite ofrecen ventajas significativas. Son altamente eficientes para la lectura de datos en un entorno multihilo. Estas colecciones funcionan de manera excepcional en situaciones donde las operaciones de lectura superan significativamente a las operaciones de escritura, lo que las convierte en una excelente opción para estos casos de uso.

Note
Nota

Sin embargo, debido a la copia en cada cambio, las colecciones CopyOnWrite pueden consumir más memoria y no son adecuadas para escenarios con operaciones de escritura frecuentes. Son más eficaces cuando las operaciones de lectura predominan sobre las de escritura.

1. ¿Qué sucede cuando se llama al método addIfAbsent(E e) en CopyOnWriteArrayList?

2. ¿Por qué las colecciones CopyOnWrite son especialmente adecuadas para escenarios con lecturas frecuentes y cambios de datos poco frecuentes?

question mark

¿Qué sucede cuando se llama al método addIfAbsent(E e) en CopyOnWriteArrayList?

Select the correct answer

question mark

¿Por qué las colecciones CopyOnWrite son especialmente adecuadas para escenarios con lecturas frecuentes y cambios de datos poco frecuentes?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 7

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Suggested prompts:

What are some common use cases for CopyOnWrite collections?

Can you explain the main differences between CopyOnWriteArrayList and CopyOnWriteArraySet?

When should I avoid using CopyOnWrite collections?

Awesome!

Completion rate improved to 3.33

bookColección CopyOnWrite

Desliza para mostrar el menú

Hemos explorado muchas colecciones sincronizadas juntos, y si ya has dominado las demás, encontrarás que esta es aún más sencilla.

Ejemplo de la vida real

Una aplicación web que utiliza CopyOnWriteArrayList para almacenar suscriptores de eventos. Varios hilos pueden recuperar simultáneamente una lista de suscriptores actuales para notificarlos sobre cambios, mientras que otros hilos pueden agregar o eliminar suscriptores.

Diferencias con otros tipos

Las colecciones CopyOnWrite crean una copia de la colección cada vez que se realiza un cambio, lo que garantiza que las operaciones de lectura no se bloqueen por cambios en los datos, proporcionando así seguridad de hilos para las lecturas, aunque las operaciones de escritura no son seguras para hilos ya que se realizan sobre una copia separada de la colección.

Vistas CopyOnWrite:

Note
Nota

Como se puede observar en la imagen, al agregar un nuevo elemento, se realiza una copia de esta estructura de datos; todos los hilos que trabajaban con esta colección antes de su modificación continuarán su trabajo sin inconvenientes, ya que estos cambios no afectarán a la copia CopyOnWrite que utilizan.

CopyOnWriteArraySet

CopyOnWriteArraySet es una implementación de conjunto segura para hilos basada en CopyOnWriteArrayList. Garantiza la seguridad en la concurrencia creando una nueva copia del conjunto base cada vez que ocurre un cambio, como agregar o eliminar elementos.

Este enfoque es especialmente útil cuando el conjunto se lee con frecuencia y se modifica rara vez, ya que proporciona una vista consistente del conjunto para todos los hilos sin requerir sincronización.

CopyOnWriteArrayList

CopyOnWriteArrayList es una variante de ArrayList segura para hilos que garantiza la seguridad en la concurrencia creando una nueva copia del array subyacente cada vez que se modifica.

Este diseño ofrece un iterador tolerante a fallos que no lanza una ConcurrentModificationException porque opera sobre una instantánea del array tomada en el momento en que se creó el iterador. Es más adecuado para situaciones donde las operaciones de lectura son significativamente más frecuentes que las operaciones de escritura, ya que la sobrecarga de copiar todo el array en cada escritura puede ser considerable.

Ejemplo práctico de caso de uso

Métodos de la colección CopyOnWrite

addIfAbsent(E e): Agrega un elemento a la lista solo si aún no está presente en la lista/múltiple.

Main.java

Main.java

copy
123456789101112131415161718192021
package com.example; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); // Attempt to add a duplicate element list.addIfAbsent("apple"); // This will not add "apple" again // Adding a new element list.addIfAbsent("orange"); // This will add "orange" System.out.println(list); // Output: [apple, banana, orange] } }

En este ejemplo, "apple" no se agrega de nuevo porque ya existe en la lista. El método addIfAbsent() previene entradas duplicadas, manteniendo la unicidad de los elementos.

addAllAbsent(Collection<? extends E> c): Agrega todos los elementos de la colección especificada a la lista/conjunto, ignorando los elementos que ya existen.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); List<String> newFruits = Arrays.asList("banana", "cherry", "date"); // Adding elements from the collection, ignoring duplicates list.addAllAbsent(newFruits); System.out.println(list); // Output: [apple, banana, cherry, date] } }

En este ejemplo, "banana" ya está presente en la lista, por lo que addAllAbsent() no la añadirá de nuevo. El método garantiza que solo los elementos únicos de la colección proporcionada se agreguen a la lista.

Note
Nota

Todos los demás métodos de las colecciones CopyOnWrite son similares a los de sus colecciones padre; simplemente copian el estado de la colección cada vez que se realizan cambios.

Limitaciones y Ventajas

😔Limitaciones:

Las colecciones CopyOnWrite presentan limitaciones notables. Suponen un costo de memoria debido a la creación de una nueva copia de la colección cada vez que se realiza un cambio, lo cual puede ser considerable. Este diseño las hace menos adecuadas para escenarios donde se requieren cambios frecuentes en los datos.

💪Ventajas:

Por otro lado, las colecciones CopyOnWrite ofrecen ventajas significativas. Son altamente eficientes para la lectura de datos en un entorno multihilo. Estas colecciones funcionan de manera excepcional en situaciones donde las operaciones de lectura superan significativamente a las operaciones de escritura, lo que las convierte en una excelente opción para estos casos de uso.

Note
Nota

Sin embargo, debido a la copia en cada cambio, las colecciones CopyOnWrite pueden consumir más memoria y no son adecuadas para escenarios con operaciones de escritura frecuentes. Son más eficaces cuando las operaciones de lectura predominan sobre las de escritura.

1. ¿Qué sucede cuando se llama al método addIfAbsent(E e) en CopyOnWriteArrayList?

2. ¿Por qué las colecciones CopyOnWrite son especialmente adecuadas para escenarios con lecturas frecuentes y cambios de datos poco frecuentes?

question mark

¿Qué sucede cuando se llama al método addIfAbsent(E e) en CopyOnWriteArrayList?

Select the correct answer

question mark

¿Por qué las colecciones CopyOnWrite son especialmente adecuadas para escenarios con lecturas frecuentes y cambios de datos poco frecuentes?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 7
some-alt