Руководство Java CopyOnWriteArraySet
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 в статье ниже:
Руководства Java Collections Framework
- Руководство Java PriorityBlockingQueue
- Руководство Java Collections Framework
- Руководство Java SortedSet
- Руководство Java List
- Руководство Java Iterator
- Руководство Java NavigableSet
- Руководство Java ListIterator
- Руководство Java ArrayList
- Руководство Java CopyOnWriteArrayList
- Руководство Java LinkedList
- Руководство Java Set
- Руководство Java TreeSet
- Руководство Java CopyOnWriteArraySet
- Руководство Java Queue
- Руководство Java Deque
- Руководство Java IdentityHashMap
- Руководство Java WeakHashMap
- Руководство Java Map
- Руководство Java SortedMap
- Руководство Java NavigableMap
- Руководство Java HashMap
- Руководство Java TreeMap
- Руководство Java PriorityQueue
- Руководство Java BlockingQueue
- Руководство Java ArrayBlockingQueue
- Руководство Java TransferQueue
Show More