betacode

Руководство Java CopyOnWriteArraySet

  1. CopyOnWriteArraySet
  2. Examples

1. CopyOnWriteArraySet

CopyOnWriteArraySet - это класс, реализующий интерфейс Set, который обычно используется в среде multithreading (многопоточной среде), и операции обхода элементов используются чаще, чем изменяемые операции, такие как add, remove, clear.
public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements java.io.Serializable
CopyOnWriteArraySet управляет объектом CopyOnWriteArrayList в нем. Все операции add, remove, clear будут выполняться в CopyOnWriteArrayList и убедитесь, что он не содержит повторяющихся элементов.
CopyOnWriteArraySet - это потокобезопасный Set (thread-safe). Это будет легче понять, если вы потратите некоторое время для чтения статьи о CopyOnWriteArrayList ниже:
Каждый раз, когда вы выполняете изменяемую операцию, такую как add, remove, clear, он создает новый массив для хранения элементов. Таким образом, стоимость использования CopyOnWriteArraySet очень высока, вы платите больше за ресурсы и производительность. Однако CopyOnWriteArraySet пригодится, когда вы не можете или не хотите синхронизировать при обходе (traverse) элементов of Set.
При создании объекта Iterator (или Stream) из CopyOnWriteArraySet, он пересекает элементы текущего массива (при создании Iterator или Stream). Элементы этого массива останутся неизменными в течение всего срока службы Iterator (или Stream). Это возможно, потому что любые операции add, remove, clear и т. д. в CopyOnWriteArraySet создадут другой массив, являющийся копией текущего массива.
Объект Iterator, полученный из CopyOnWriteArraySet, не поддерживает операцию Iterator.remove. Если она используется намеренно, вы получите исключение UnsupportedOperationException.

2. Examples

Например: выполните итерацию по элементам CopyOnWriteArraySet с помощью Iterator, который поможет вам выполнить итерацию по элементам текущего массива (в момент создания Iterator).
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
Примечание: Iterator of CopyOnWriteArraySet не поддерживает операцию Iterator.remove.
Stream:
Прохождение элементов of CopyOnWriteArraySet через Stream также имеет тот же результат, что и 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
Помимо тех специальных характеристик, упомянутых выше, CopyOnWriteArraySet также является обычным Set, вы можете найти другие примеры o Set в статье ниже: