Colecció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:
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
123456789101112131415161718192021package 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
12345678910111213141516171819202122package 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.
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.
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?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 3.33
Colecció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:
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
123456789101112131415161718192021package 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
12345678910111213141516171819202122package 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.
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.
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?
¡Gracias por tus comentarios!