CopyOnWriteArraySet
Dies 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 framework
des Pakets und befinden sich darin
java.util.concurrent
.
CopyOnWriteArraySet
Am 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
CopyOnWriteArraySet
ein 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,
CopyOnWriteArraySet
ist, dass es mithilfe von implementiert wird
CopyOnWriteArrayList
. Dies bedeutet, dass es
CopyOnWriteArraySet
auch 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
Set
mithilfe 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
set
klein 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,
CopyOnWriteArraySet
ist 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;
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);
}
}
Ausgabe:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
Woran Sie sich erinnern sollten
CopyOnWriteArraySet
implementiert die in JDK 1.5 hinzugefügten
Collection
und -Schnittstellen
Set
sowie eine weitere benutzerdefinierte Implementierung von
Set
'a,
EnumSet
. Es ist auch
Set
eines, 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.
-
CopyOnWriteArraySet
Am besten geeignet für Anwendungen, bei denen:
- Die Größen
Set
der 's bleiben tendenziell klein.
- Operationen
read-only
sind Operationen, die Objekte modifizieren, deutlich überlegen.
- Sie müssen Interferenzen zwischen Threads während des Durchlaufs verhindern
Set
.
- Ein weiterer Vorteil
CopyOnWriteArraySet
ist die Thread-Sicherheit. Diese Sammlung unterstützt Parallelität.
- Mutative Vorgänge (Hinzufügen, Ändern, Löschen usw.) sind teuer, da sie normalerweise das Kopieren des gesamten zugrunde liegenden Arrays erfordern.
- Iteratoren unterstützen den mutativen Löschvorgang nicht.
- 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
CopyOnWriteArraySet
in 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
List
ist die Reihenfolge der Elemente wichtig und kann Duplikate enthalten. Obwohl
Set
es ungeordnet ist, erlaubt es keine Duplizierung von Objekten. Denken Sie immer daran, dass
CopyOnWriteArraySet
es 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 ,
HashSet
oder
LinkedHashSet
synchronisierte Sammlungsklassen. Original:
Verwendung von CopyOnWriteArraySet in Java anhand eines Beispiels
GO TO FULL VERSION