codestory

Die Anleitung zu Java CopyOnWriteArraySet

  1. CopyOnWriteArraySet
  2. Examples

1. CopyOnWriteArraySet

CopyOnWriteArraySet ist eine Klasse, die die Interface Set implementiert, die häufig in einer Umgebung Multithreading verwendet wird, und die Durchlaufoperation auf Element werden häufiger verwendet als veränderliche Operationen wie add, remove, clear.
public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements java.io.Serializable
CopyOnWriteArraySet verwaltet darin ein Objekt CopyOnWriteArrayList. Alle Operationen add, remove, clear werden auf CopyOnWriteArrayList ausgeführt und stellen sicher, dass sie keine doppelten Elemente enthält.
CopyOnWriteArraySet ist ein threadsicheres Set. Es wird leichter zu verstehen sein, wenn Sie einige Zeit damit verbringen, den folgenden Artikel über CopyOnWriteArrayList zu lesen:
Jedes Mal, wenn Sie eine veränderliche Operation wie add, remove, clear ausführen, wird ein neues Array zum Speichern von Elementen erstellt. Die Kosten für die Verwendung von CopyOnWriteArraySet sind also sehr hoch, Sie zahlen mehr für Ressourcen und Leistung. CopyOnWriteArraySet ist jedoch praktisch, wenn Sie nicht synchronisieren können oder möchten, während Sie die Elemente vom Set durchlaufen.
Wenn Sie ein Objekt Iterator (oder Stream) aus CopyOnWriteArraySet erstellen, durchläuft es die Elemente des aktuellen Arrays (wenn Iterator oder Stream erstellt wurde). Die Elemente dieses Arrays bleiben während der Lebensdauer von Iterator (oder Stream) unverändert. Dies ist möglich, da alle Operationen add, remove, clear, .. auf CopyOnWriteArraySet ein weiteres Array erstellen, das eine Kopie des aktuellen Arrays ist.
Das von CopyOnWriteArraySet erhaltene Objekt Iterator unterstützt den Vorgang Iterator.remove nicht. Wenn es absichtlich verwendet wird, erhalten Sie UnsupportedOperationException.

2. Examples

Beispiel: Laufen Sie die Elemente von CopyOnWriteArraySet mit Iterator durch, was Ihnen hilft, über die Elemente des aktuellen Arrays durchzulaufen (zu dem Zeitpunkt, zu dem der Iterator erstellt wird).
CopyOnWriteArraySetEx1.java
package org.o7planning.copyonwritearrayset.ex;

import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

public class CopyOnWriteArraySetEx1 {

    public static void main(String[] args) {
        // Create a CopyOnWriteArraySet object:
        Set<String> set = new CopyOnWriteArraySet<String>();
        set.add("A");
        set.add("B");
        set.add("C");
        
        Iterator<String> iterator1 = set.iterator();
        
        set.add("X1");
        set.add("X2");
        
        Iterator<String> iterator2 = set.iterator();
        
        System.out.println("--- Iterator 1: -----");
        while(iterator1.hasNext()) {
            System.out.println(iterator1.next());
        }
        
        System.out.println("--- Iterator 2: -----");
        while(iterator2.hasNext()) {
            System.out.println(iterator2.next());
        }
    }
}
Output:
--- Iterator 1: -----
A
B
C
--- Iterator 2: -----
A
B
C
X1
X2
Hinweis: Der Iterator von CopyOnWriteArraySet unterstützt den Vorgang Iterator.remove nicht.
Stream:
Das Durchlaufen der Elemente von CopyOnWriteArraySet durch Stream hat auch das gleiche Ergebnis wie Iterator.
CopyOnWriteArraySetEx2.java
package org.o7planning.copyonwritearrayset.ex;

import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Stream;

public class CopyOnWriteArraySetEx2 {

    public static void main(String[] args) {
        // Create a CopyOnWriteArraySet object:
        Set<String> set = new CopyOnWriteArraySet<String>();
        set.add("A");
        set.add("B");
        set.add("C");  
        
        Stream<String> stream1 = set.stream();
        
        set.add("X1");
        set.add("X2");
        
        Stream<String> stream2 = set.stream();
        
        System.out.println("--- Stream 1: -----");
        stream1.forEach(System.out::println);
        
        System.out.println("--- Stream 2: -----");
        stream2.forEach(System.out::println);
    }
}
Output:
--- Stream 1: -----
A
B
C
--- Stream 2: -----
A
B
C
X1
X2
Neben den oben genannten besonderen Eigenschaften ist CopyOnWriteArraySet auch ein reguläres Set, weitere Beispiele für Set finden Sie im folgenden Artikel: