JavaRush /Java-Blog /Random-DE /Verwendung von CopyOnWriteArraySet in Java anhand eines B...
Lam-lam
Level 30

Verwendung von CopyOnWriteArraySet in Java anhand eines Beispiels (Übersetzung)

Veröffentlicht in der Gruppe Random-DE
CopyOnWriteArraySetDies ist der jüngere Bruder der Klasse CopyOnWriteArrayList. Hierbei handelt es sich um einen speziellen Satz von Klassen, die zusammen mit ihrem populäreren Cousin in JDK 1.5 hinzugefügt wurden ConcurrentHashMap. Sie sind Teil concurrent collection frameworkdes Pakets und befinden sich darin java.util.concurrent. So verwenden Sie CopyOnWriteArraySet in Java anhand eines Beispiels (Übersetzung) - 1CopyOnWriteArraySetAm besten geeignet für schreibgeschützte Sammlungen, die klein genug sind, um kopiert zu werden, wenn einige Änderungsvorgänge durchgeführt werden. Beispielsweise können Sie damit CopyOnWriteArraySetein Objekt speichern, wenn die Anwendung gestartet wird, und mehrere andere Threads während des gesamten Lebenszyklus der Anwendung auf dieses Objekt zugreifen lassen. Wenn in dieser Zeit ein neuer Zustand oder ein neues Objekt eintrifft, kann es auch zu diesem hinzugefügt werden Set, allerdings auf Kosten der Erstellung eines neuen Arrays. Eines der wichtigsten Dinge, die Sie wissen sollten, CopyOnWriteArraySetist, dass es mithilfe von implementiert wird CopyOnWriteArrayList. Dies bedeutet, dass es CopyOnWriteArraySetauch alle grundlegenden Eigenschaften von teilt CopyOnWriteArrayList. Ein weiterer wichtiger Punkt, den Sie beachten sollten, ist, dass die Iteratoren dieser Sammlungsklasse das nicht unterstützen remove(). Der Versuch, ein Element während der Integration zu entfernen, führt zu einem Ausreißer UnsupportedOperationException. Dies geschieht, um die Geschwindigkeit beim Kriechen sicherzustellen. Das Durchlaufen dieser Implementierung Setmithilfe eines Iterators ist recht schnell und vermeidet Störungen durch andere Threads. Für den Betrieb stützen sich Iteratoren auf einen Snapshot des Arrays, der bei der Erstellung des Iterators erstellt wurde. Kurz gesagt, verwenden Sie es CopyOnWriteArraySet, wenn es setklein genug ist, um es beim Hinzufügen, Festlegen oder Löschen von Objekten zu kopieren, und der Hauptzweck darin besteht, sporadisch aktualisierte Daten zu lesen. Wenn Sie außerdem Elemente während der Iteration entfernen möchten, verwenden Sie diese Implementierung nicht, da ihr Iterator remove(), und wirft nicht unterstützt java.lang.UnsupportedOperationException, wie unten gezeigt:
[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)

CopyOnWriteArraySet-Beispiel in Java

Hier ist ein fertiges Java-Programm, das die Verwendung zeigt CopyOnWriteArraySet. In unserem Beispiel haben wir das Muster „publisher -subscriber“ verwendet , um seine Verwendung zu demonstrieren. Die meisten Abonnenten werden beim Start der Anwendung abonniert und die Hauptaufgabe des Herausgebers besteht darin, sie aufzuzählen und über etwaige Aktualisierungen zu informieren. Von Zeit zu Zeit kann es zu Neuzugängen und Löschungen von Abonnenten kommen. Da wir eine schnelle Umgehung benötigen, CopyOnWriteArraySetist dies eine gute Wahl, insbesondere in einer Umgebung mit mehreren Threads, in der ein Thread einen Abonnenten hinzufügen kann, während ein anderer Thread Aktualisierungen verarbeitet.
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);
    }
}
Ausgabe:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX

Woran Sie sich erinnern sollten

CopyOnWriteArraySetimplementiert die in JDK 1.5 hinzugefügten Collectionund -Schnittstellen Setsowie eine weitere benutzerdefinierte Implementierung von Set'a, EnumSet. Es ist auch Seteines, das für alle seine Vorgänge interne Daten verwendet CopyOnWriteArrayList. Daher weist sie dieselben Grundeigenschaften wie diese Klasse auf. Da dies nicht der Fall ist SortedSet, ist die Reihenfolge der Elemente während der Iteration nicht garantiert. So verwenden Sie CopyOnWriteArraySet in Java anhand eines Beispiels (Übersetzung) - 2
  1. CopyOnWriteArraySetAm besten geeignet für Anwendungen, bei denen:

    • Die Größen Setder 's bleiben tendenziell klein.
    • Operationen read-onlysind Operationen, die Objekte modifizieren, deutlich überlegen.
    • Sie müssen Interferenzen zwischen Threads während des Durchlaufs verhindern Set.
  2. Ein weiterer Vorteil CopyOnWriteArraySetist die Thread-Sicherheit. Diese Sammlung unterstützt Parallelität.
  3. Mutative Vorgänge (Hinzufügen, Ändern, Löschen usw.) sind teuer, da sie normalerweise das Kopieren des gesamten zugrunde liegenden Arrays erfordern.
  4. Iteratoren unterstützen den mutativen Löschvorgang nicht.
  5. Die Traversierung mit einem Iterator ist recht schnell und die Beeinträchtigung durch andere Threads ist ausgeschlossen. Für den Betrieb stützen sich Iteratoren auf einen Snapshot des Arrays, der bei der Erstellung des Iterators erstellt wurde.
Das ist alles über die Verwendung CopyOnWriteArraySetin Java. Wie gesagt, er ist der jüngere Bruder CopyOnWriteArrayList. Wenn Sie also mindestens eine davon verstehen, können Sie die andere verwenden. Der einzige Unterschied besteht darin, dass eine List„“ und die andere Set„“ ist. Dies bedeutet also, dass alle Unterschiede zwischen diesen Datenstrukturen in Java geerbt werden. Beispielsweise Listist die Reihenfolge der Elemente wichtig und kann Duplikate enthalten. Obwohl Setes ungeordnet ist, erlaubt es keine Duplizierung von Objekten. Denken Sie immer daran, dass CopyOnWriteArraySetes sich um einen Spezialkurs handelt Collection. Es sollte nur bei günstigen Bedingungen eingesetzt werden. In allen anderen Fällen können Sie Allzweckimplementierungen verwenden. Zum Beispiel , HashSetoder LinkedHashSetsynchronisierte Sammlungsklassen. Original: Verwendung von CopyOnWriteArraySet in Java anhand eines Beispiels
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION