JavaRush /Java Blog /Random-IT /Come utilizzare CopyOnWriteArraySet in Java con esempio (...
Lam-lam
Livello 30

Come utilizzare CopyOnWriteArraySet in Java con esempio (traduzione)

Pubblicato nel gruppo Random-IT
CopyOnWriteArraySetQuesto è il fratello minore della classe CopyOnWriteArrayList. Si tratta di un insieme specializzato di classi aggiunte in JDK 1.5 insieme al loro cugino più popolare ConcurrentHashMap. Fanno parte concurrent collection frameworke si trovano nella confezione java.util.concurrent. Come utilizzare CopyOnWriteArraySet in Java con esempio (traduzione) - 1CopyOnWriteArraySetIdeale per raccolte di sola lettura di dimensioni sufficientemente ridotte da poter essere copiate se si verificano alcune operazioni di modifica. Ad esempio, è possibile CopyOnWriteArraySetarchiviare un oggetto all'avvio dell'applicazione e consentire a più thread di accedere a tale oggetto durante il ciclo di vita dell'applicazione. Se in questo periodo arriva un nuovo stato o oggetto, potrà essere aggiunto anche a questo Set, al costo di creare un nuovo array. Una delle cose più importanti da sapere CopyOnWriteArraySetè che viene implementato utilizzando CopyOnWriteArrayList. Ciò significa che CopyOnWriteArraySetcondivide anche tutte le proprietà di base di CopyOnWriteArrayList. Un'altra cosa importante da ricordare è che gli iteratori di questa classe di raccolta non supportano remove(). Il tentativo di rimuovere un elemento durante l'integrazione risulterà in un valore anomalo UnsupportedOperationException. Questo viene fatto per garantire la velocità durante la scansione. Attraversare questa implementazione Setutilizzando un iteratore è abbastanza veloce ed evita interferenze da altri thread. Per funzionare, gli iteratori si basano su uno snapshot dell'array acquisito al momento della creazione dell'iteratore. In breve, utilizzare CopyOnWriteArraySetse setabbastanza piccolo da poter essere copiato quando si aggiungono, impostano o eliminano oggetti e lo scopo principale è leggere dati aggiornati sporadicamente. Inoltre, se desideri rimuovere elementi durante l'iterazione, non utilizzare questa implementazione perché il suo iteratore non supporta remove()e lancia java.lang.UnsupportedOperationException, come mostrato di seguito:
[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)

Esempio CopyOnWriteArraySet in Java

Ecco un programma Java già pronto che mostra come utilizzare CopyOnWriteArraySet. Nel nostro esempio, abbiamo utilizzato il modello editore -abbonato per dimostrarne l'utilizzo. La maggior parte degli abbonati viene sottoscritta al momento del lancio dell'applicazione e il compito principale dell'editore è censirli e notificare loro eventuali aggiornamenti. Di tanto in tanto possono verificarsi aggiunte ed eliminazioni di abbonati. Poiché è necessario un bypass veloce, CopyOnWriteArraySetquesta è una buona scelta, soprattutto in un ambiente multi-thread in cui un thread può aggiungere un sottoscrittore mentre un altro thread gestisce gli aggiornamenti.
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);
    }
}
Produzione:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX

Cosa ricordare

CopyOnWriteArraySetimplementa le interfacce Collectione Set, nonché, aggiunte in JDK 1.5, insieme a un'altra implementazione personalizzata di Set'a, EnumSet. È anche Setuno che utilizza l'interno CopyOnWriteArrayListper tutte le sue operazioni. Pertanto, condivide le stesse proprietà di base di questa classe. Poiché non lo è SortedSet, l'ordine degli elementi non è garantito durante l'iterazione. Come utilizzare CopyOnWriteArraySet in Java con esempio (traduzione) - 2
  1. CopyOnWriteArraySetIdeale per applicazioni in cui:

    • Le dimensioni Setdel ' tendono a rimanere piccole.
    • Le operazioni read-onlysono significativamente superiori alle operazioni che modificano gli oggetti.
    • È necessario evitare interferenze tra i thread durante l'attraversamento Set.
  2. Un altro vantaggio CopyOnWriteArraySetè la sicurezza del thread. Questa raccolta supporta la concorrenza.
  3. Le operazioni mutative (aggiunta, modifica, eliminazione e così via) sono costose perché in genere richiedono la copia dell'intero array sottostante.
  4. Gli iteratori non supportano l'operazione di eliminazione mutativa.
  5. L'attraversamento tramite iteratore è abbastanza veloce e durante esso è esclusa l'interferenza di altri thread. Per funzionare, gli iteratori si basano su uno snapshot dell'array acquisito al momento della creazione dell'iteratore.
Questo è tutto sull'utilizzo CopyOnWriteArraySetin Java. Come ho detto, è il fratello minore CopyOnWriteArrayList. Quindi se ne capisci almeno uno, puoi usare l'altro. L'unica differenza è che uno è List'' e l'altro Setè '', quindi ciò implica ereditare tutte le differenze tra queste strutture dati in Java. Ad esempio, Listl'ordine degli elementi è importante e potrebbe contenere duplicati. Sebbene Setnon ordinato, non consente la duplicazione di oggetti. Ricorda sempre che CopyOnWriteArraySetquesta è una classe specializzata Collection. Dovrebbe essere utilizzato solo quando le condizioni sono favorevoli. In ogni altro caso, è possibile utilizzare implementazioni generiche. Ad esempio, HashSeto LinkedHashSetclassi di raccolta sincronizzate. Originale: come utilizzare CopyOnWriteArraySet in Java con l'esempio
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION