CopyOnWriteArraySet
이 반의 남동생입니다
CopyOnWriteArrayList
. 이는 더 인기 있는 클래스와 함께 JDK 1.5에 추가된 특수 클래스 세트입니다
ConcurrentHashMap
. 이는 패키지의 일부
concurrent collection framework
이며 패키지에 들어 있습니다
java.util.concurrent
.
CopyOnWriteArraySet
일부 수정 작업이 발생할 경우 복사할 수 있을 만큼 크기가 작은 읽기 전용 컬렉션에 가장 적합합니다.
CopyOnWriteArraySet
예를 들어, 애플리케이션이 시작될 때 개체를 저장하고 다른 여러 스레드가 애플리케이션의 수명 주기 전반에 걸쳐 해당 개체에 액세스하도록 하는 데 사용할 수 있습니다 .
Set
이 시간 동안 새로운 상태나 개체가 도착하면 새 배열을 만드는 대신 이 항목에 추가될 수도 있습니다 . 알아야 할 가장 중요한 것 중 하나
CopyOnWriteArraySet
는
CopyOnWriteArrayList
. 이는
CopyOnWriteArraySet
의 모든 기본 속성도 공유한다는 의미입니다
CopyOnWriteArrayList
. 기억해야 할 또 다른 중요한 점은 이 컬렉션 클래스의 반복자가
remove()
. 통합 중에 요소를 제거하려고 하면 이상값이 발생합니다
UnsupportedOperationException
. 이는 크롤링 중 속도를 보장하기 위해 수행됩니다.
Set
반복자를 사용하여 이 구현을 순회하는 것은 상당히 빠르며 다른 스레드의 간섭을 방지합니다. 작동하기 위해 반복자는 반복자가 생성될 때 생성된 배열의 스냅샷에 의존합니다. 즉, 객체를 추가, 설정, 삭제할 때 복사할 수 있을 만큼 작은
CopyOnWriteArraySet
경우 사용하고, 산발적으로 업데이트되는 데이터를 읽는 것이 주된 목적입니다.
set
또한 반복 중에 요소를 제거하려는 경우 이 구현을 사용하지 마십시오. 반복자가 아래와 같이
remove()
, 및 throws를 지원하지 않기 때문입니다.
java.lang.UnsupportedOperationException
[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)
Java의 CopyOnWriteArraySet 예
다음은 사용 방법을 보여주는 기성 Java 프로그램입니다
CopyOnWriteArraySet
. 이 예에서는 게시자
- 구독자 패턴을 사용하여 사용법을 보여주었습니다. 대부분의 구독자는 애플리케이션이 시작되는 동안 구독되며 게시자의 주요 임무는 구독자를 열거하고 업데이트를 알리는 것입니다. 때때로 가입자 추가 및 삭제가 발생할 수 있습니다. 빠른 우회가 필요하므로
CopyOnWriteArraySet
이는 좋은 선택입니다. 특히 한 스레드가 구독자를 추가하고 다른 스레드가 업데이트를 처리하는 다중 스레드 환경에서는 더욱 그렇습니다.
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);
}
}
산출:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
기억해야 할 것
CopyOnWriteArraySet
Collection
및 인터페이스를 구현하고 'a'
Set
의 또 다른 사용자 정의 구현과 함께 JDK 1.5에 추가되었습니다 . 또한 모든 작업에 내부를 사용하는 것이기 도 합니다 . 따라서 이 클래스와 동일한 기본 속성을 공유합니다. 가 아니므로 반복 중에 요소의 순서가 보장되지 않습니다.
Set
EnumSet
Set
CopyOnWriteArrayList
SortedSet
-
CopyOnWriteArraySet
다음과 같은 용도에 가장 적합합니다.
Set
의 크기는 작게 유지되는 경향이 있습니다.
- 작업은
read-only
개체를 수정하는 작업보다 훨씬 우수합니다.
- 순회 중에 스레드 간의 간섭을 방지해야 합니다
Set
.
- 또 다른 장점은
CopyOnWriteArraySet
스레드 안전성입니다. 이 컬렉션은 동시성을 지원합니다.
- 가변 작업(추가, 수정, 삭제 등)은 일반적으로 전체 기본 배열을 복사해야 하기 때문에 비용이 많이 듭니다.
- 반복자는 가변 삭제 작업을 지원하지 않습니다.
- 반복자를 사용한 순회는 매우 빠르며 그 동안 다른 스레드의 간섭이 제외됩니다. 작동하기 위해 반복자는 반복자가 생성될 때 생성된 배열의 스냅샷에 의존합니다.
이것이
CopyOnWriteArraySet
Java에서의 사용법에 관한 것입니다. 내가 말했듯이 그는 남동생입니다
CopyOnWriteArrayList
. 따라서 그 중 적어도 하나를 이해하면 다른 하나를 사용할 수 있습니다. 유일한 차이점은 하나는
List
''이고 다른 하나
Set
는 ''라는 점입니다. 따라서 이는 Java에서 이러한 데이터 구조 간의 모든 차이점을 상속하는 것을 수반합니다. 예를 들어
List
요소의 순서가 중요하며 중복된 요소가 포함될 수 있습니다. 순서
Set
가 지정되지 않은 상태에서는 개체의 복제가 허용되지 않습니다.
CopyOnWriteArraySet
이 수업은 전문 수업이라는 점을 항상 기억하세요
Collection
. 조건이 좋을 때만 사용해야 합니다. 다른 경우에는 범용 구현을 사용할 수 있습니다. 예를 들어,
HashSet
또는
LinkedHashSet
동기화된 컬렉션 클래스입니다. 원본:
예제를 통해 Java에서 CopyOnWriteArraySet을 사용하는 방법
GO TO FULL VERSION