JavaRush /Java Blog /Random-KO /예제를 통해 Java에서 CopyOnWriteArraySet을 사용하는 방법(번역)
Lam-lam
레벨 30

예제를 통해 Java에서 CopyOnWriteArraySet을 사용하는 방법(번역)

Random-KO 그룹에 게시되었습니다
CopyOnWriteArraySet이 반의 남동생입니다 CopyOnWriteArrayList. 이는 더 인기 있는 클래스와 함께 JDK 1.5에 추가된 특수 클래스 세트입니다 ConcurrentHashMap. 이는 패키지의 일부 concurrent collection framework이며 패키지에 들어 있습니다 java.util.concurrent. Java에서 CopyOnWriteArraySet을 사용하는 방법(예제(번역)) - 1CopyOnWriteArraySet일부 수정 작업이 발생할 경우 복사할 수 있을 만큼 크기가 작은 읽기 전용 컬렉션에 가장 적합합니다. CopyOnWriteArraySet예를 들어, 애플리케이션이 시작될 때 개체를 저장하고 다른 여러 스레드가 애플리케이션의 수명 주기 전반에 걸쳐 해당 개체에 액세스하도록 하는 데 사용할 수 있습니다 . Set이 시간 동안 새로운 상태나 개체가 도착하면 새 배열을 만드는 대신 이 항목에 추가될 수도 있습니다 . 알아야 할 가장 중요한 것 중 하나 CopyOnWriteArraySetCopyOnWriteArrayList. 이는 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;

/**
 * Java program to demonstrate how to use CopyOnWriteArraySet in Java. Remember,
 * CopyOnWriteArraySet doesn't support remove() operation.
 *
 * @author Javin Paul
 */
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);

            //itr.remove(); // not allowed, throws UnsupportedOperationException
        }
    }
}

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

기억해야 할 것

CopyOnWriteArraySetCollection및 인터페이스를 구현하고 'a' Set의 또 다른 사용자 정의 구현과 함께 JDK 1.5에 추가되었습니다 . 또한 모든 작업에 내부를 사용하는 것이기 도 합니다 . 따라서 이 클래스와 동일한 기본 속성을 공유합니다. 가 아니므로 반복 중에 요소의 순서가 보장되지 않습니다. SetEnumSetSetCopyOnWriteArrayListSortedSetJava에서 CopyOnWriteArraySet을 사용하는 방법(예제(번역)) - 2
  1. CopyOnWriteArraySet다음과 같은 용도에 가장 적합합니다.

    • Set의 크기는 작게 유지되는 경향이 있습니다.
    • 작업은 read-only개체를 수정하는 작업보다 훨씬 우수합니다.
    • 순회 중에 스레드 간의 간섭을 방지해야 합니다 Set.
  2. 또 다른 장점은 CopyOnWriteArraySet스레드 안전성입니다. 이 컬렉션은 동시성을 지원합니다.
  3. 가변 작업(추가, 수정, 삭제 등)은 일반적으로 전체 기본 배열을 복사해야 하기 때문에 비용이 많이 듭니다.
  4. 반복자는 가변 삭제 작업을 지원하지 않습니다.
  5. 반복자를 사용한 순회는 매우 빠르며 그 동안 다른 스레드의 간섭이 제외됩니다. 작동하기 위해 반복자는 반복자가 생성될 때 생성된 배열의 스냅샷에 의존합니다.
이것이 CopyOnWriteArraySetJava에서의 사용법에 관한 것입니다. 내가 말했듯이 그는 남동생입니다 CopyOnWriteArrayList. 따라서 그 중 적어도 하나를 이해하면 다른 하나를 사용할 수 있습니다. 유일한 차이점은 하나는 List''이고 다른 하나 Set는 ''라는 점입니다. 따라서 이는 Java에서 이러한 데이터 구조 간의 모든 차이점을 상속하는 것을 수반합니다. 예를 들어 List요소의 순서가 중요하며 중복된 요소가 포함될 수 있습니다. 순서 Set가 지정되지 않은 상태에서는 개체의 복제가 허용되지 않습니다. CopyOnWriteArraySet이 수업은 전문 수업이라는 점을 항상 기억하세요 Collection. 조건이 좋을 때만 사용해야 합니다. 다른 경우에는 범용 구현을 사용할 수 있습니다. 예를 들어, HashSet또는 LinkedHashSet동기화된 컬렉션 클래스입니다. 원본: 예제를 통해 Java에서 CopyOnWriteArraySet을 사용하는 방법
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION