JavaRush /Blog Java /Random-ES /Cómo utilizar CopyOnWriteArraySet en Java con ejemplo (tr...
Lam-lam
Nivel 30

Cómo utilizar CopyOnWriteArraySet en Java con ejemplo (traducción)

Publicado en el grupo Random-ES
CopyOnWriteArraySetEste 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 frameworky están ubicados en el paquete java.util.concurrent. Cómo usar CopyOnWriteArraySet en Java con ejemplo (traducción) - 1CopyOnWriteArraySetEs 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 CopyOnWriteArraySetpara 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 CopyOnWriteArraySetes que se implementa mediante CopyOnWriteArrayList. Esto significa que CopyOnWriteArraySettambié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 Setutilizando 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 CopyOnWriteArraySetsi es setlo 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, CopyOnWriteArraySetesta 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;

/**
 * Java program to demonstrate how to use CopyOnWriteArraySet in Java. Remember,
 * CopyOnWriteArraySet doesn't support remove() operation.
 *
 * @author Javin Paul
 */
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);

            //itr.remove(); // not allowed, throws UnsupportedOperationException
        }
    }
}

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

CopyOnWriteArraySetimplementa las interfaces Collectiony Set, además de agregarse en JDK 1.5, junto con otra implementación personalizada de Set'a, EnumSet. También es Setaquel que utiliza internos CopyOnWriteArrayListpara 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. Cómo usar CopyOnWriteArraySet en Java con ejemplo (traducción) - 2
  1. CopyOnWriteArraySetMás adecuado para aplicaciones donde:

    • Los tamaños Setde los 's tienden a ser pequeños.
    • Las operaciones read-onlyson significativamente superiores a las operaciones que modifican objetos.
    • Debe evitar la interferencia entre subprocesos durante el recorrido Set.
  2. Otra ventaja CopyOnWriteArraySetes la seguridad del hilo. Esta colección admite la simultaneidad.
  3. Las operaciones mutativas (agregar, modificar, eliminar, etc.) son costosas porque normalmente requieren copiar toda la matriz subyacente.
  4. Los iteradores no admiten la operación de eliminación mutativa.
  5. 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 CopyOnWriteArraySeten 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 Setes '', por lo que esto implica heredar todas las diferencias entre estas estructuras de datos en Java. Por ejemplo, Listel orden de los elementos es importante y puede contener duplicados. Si bien Setestá desordenado, no permite la duplicación de objetos. Recuerda siempre que CopyOnWriteArraySetesta 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, HashSeto LinkedHashSetclases de colección sincronizadas. Original: Cómo utilizar CopyOnWriteArraySet en Java con ejemplo
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION