CopyOnWriteArraySet
Este es el hermano menor de la clase
CopyOnWriteArrayList
. Se trata de un conjunto especializado de clases agregadas en JDK 1.5 junto con su prima más popular
ConcurrentHashMap
. Son parte
concurrent collection framework
y están ubicados en el paquete
java.util.concurrent
.
CopyOnWriteArraySet
Es más adecuado para colecciones de solo lectura que son lo suficientemente pequeñas como para copiarlas si se producen algunas operaciones de modificación. Por ejemplo, podría usarlo
CopyOnWriteArraySet
para almacenar un objeto cuando se inicia la aplicación y hacer que otros subprocesos accedan a ese objeto durante todo el ciclo de vida de la aplicación. Si durante este tiempo llega un nuevo estado u objeto, también podrá agregarse a éste
Set
, a costa de crear una nueva matriz. Una de las cosas más importantes que hay que saber
CopyOnWriteArraySet
es que se implementa mediante
CopyOnWriteArrayList
. Esto significa que
CopyOnWriteArraySet
también comparte todas las propiedades básicas de
CopyOnWriteArrayList
. Otra cosa importante para recordar es que los iteradores de esta clase de colección no admiten
remove()
. Intentar eliminar un elemento durante la integración dará como resultado un valor atípico
UnsupportedOperationException
. Esto se hace para garantizar la velocidad durante el rastreo. Recorrer esta implementación
Set
utilizando un iterador es bastante rápido y evita la interferencia de otros subprocesos. Para funcionar, los iteradores se basan en una instantánea de la matriz que se tomó cuando se creó el iterador. En resumen, utilícelo
CopyOnWriteArraySet
si es
set
lo suficientemente pequeño como para copiarlo al agregar, configurar o eliminar objetos, y el objetivo principal es leer datos actualizados esporádicamente. Además, si desea eliminar elementos durante la iteración, no utilice esta implementación porque su iterador no admite
remove()
y arroja
java.lang.UnsupportedOperationException
, como se muestra a continuación:
[RAJ] Event received : FOUR
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(Unknown Source)
at Publisher.notifySubs(HelloHP.java:43)
at HelloHP.main(HelloHP.java:23)
Ejemplo de CopyOnWriteArraySet en Java
Aquí hay un programa Java listo para usar que muestra cómo usarlo
CopyOnWriteArraySet
. En nuestro ejemplo, utilizamos el patrón editor
-suscriptor para demostrar su uso. La mayoría de los suscriptores se suscriben durante el lanzamiento de la aplicación y la tarea principal del editor es enumerarlos y notificarles sobre cualquier actualización. Es posible que de vez en cuando se agreguen y eliminen suscriptores. Dado que necesitamos una derivación rápida,
CopyOnWriteArraySet
esta es una buena opción, especialmente en un entorno de subprocesos múltiples donde un subproceso puede agregar un suscriptor mientras otro subproceso maneja las actualizaciones.
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet;
public class CopyOnWriteArraySetDemo{
public static void main(String args[]) {
Publisher cricNext = new Publisher();
SubScriber raj = new SubScriber("RAJ");
SubScriber adom = new SubScriber("ADOM");
cricNext.addSubscriber(raj);
cricNext.addSubscriber(adom);
cricNext.notifySubs("FOUR");
cricNext.notifySubs("SIX");
}
}
class Publisher {
private CopyOnWriteArraySet setOfSubs = new CopyOnWriteArraySet();
public void addSubscriber(SubScriber sub) {
setOfSubs.add(sub);
}
public void notifySubs(String score) {
Iterator itr = setOfSubs.iterator();
while (itr.hasNext()) {
SubScriber sub = itr.next();
sub.receive(score);
}
}
}
class SubScriber {
private String _name;
public SubScriber(String name) {
this._name = name;
}
public void receive(String score) {
System.out.printf("[%s] Event received : %s %n", _name, score);
}
}
Producción:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
que recordar
CopyOnWriteArraySet
implementa las interfaces
Collection
y
Set
, además de agregarse en JDK 1.5, junto con otra implementación personalizada de
Set
'a,
EnumSet
. También es
Set
aquel que utiliza internos
CopyOnWriteArrayList
para todas sus operaciones. Por tanto, comparte las mismas propiedades básicas de esta clase. Como no es así
SortedSet
, el orden de los elementos no está garantizado durante la iteración.
-
CopyOnWriteArraySet
Más adecuado para aplicaciones donde:
- Los tamaños
Set
de los 's tienden a ser pequeños.
- Las operaciones
read-only
son significativamente superiores a las operaciones que modifican objetos.
- Debe evitar la interferencia entre subprocesos durante el recorrido
Set
.
- Otra ventaja
CopyOnWriteArraySet
es la seguridad del hilo. Esta colección admite la simultaneidad.
- Las operaciones mutativas (agregar, modificar, eliminar, etc.) son costosas porque normalmente requieren copiar toda la matriz subyacente.
- Los iteradores no admiten la operación de eliminación mutativa.
- El recorrido mediante un iterador es bastante rápido y durante el mismo se excluye la interferencia de otros subprocesos. Para funcionar, los iteradores se basan en una instantánea de la matriz que se tomó cuando se creó el iterador.
Se trata de uso
CopyOnWriteArraySet
en Java. Como dije, él es el hermano menor
CopyOnWriteArrayList
. Entonces, si entiendes al menos uno de ellos, puedes utilizar el otro. La única diferencia es que uno es
List
'' y el otro
Set
es '', por lo que esto implica heredar todas las diferencias entre estas estructuras de datos en Java. Por ejemplo,
List
el orden de los elementos es importante y puede contener duplicados. Si bien
Set
está desordenado, no permite la duplicación de objetos. Recuerda siempre que
CopyOnWriteArraySet
esta es una clase especializada
Collection
. Sólo debe utilizarse cuando las condiciones sean favorables. En cualquier otro caso, puede utilizar implementaciones de propósito general. Por ejemplo,
HashSet
o
LinkedHashSet
clases de colección sincronizadas. Original:
Cómo utilizar CopyOnWriteArraySet en Java con ejemplo
GO TO FULL VERSION