JavaRush /Java Blog /Random-JA /Java で CopyOnWriteArraySet を使用する方法と例 (翻訳)
Lam-lam
レベル 30

Java で CopyOnWriteArraySet を使用する方法と例 (翻訳)

Random-JA グループに公開済み
CopyOnWriteArraySetこちらはクラスの弟ですCopyOnWriteArrayList。これらは、より一般的なクラスとともに、JDK 1.5 で追加された特殊なクラスのセットですConcurrentHashMapconcurrent collection frameworkこれらはパッケージの一部であり、パッケージ内にありますjava.util.concurrentJava で CopyOnWriteArraySet を使用する方法と例 (翻訳) - 1CopyOnWriteArraySet変更操作が発生した場合にコピーできるサイズの小さい読み取り専用コレクションに最適です。たとえば、CopyOnWriteArraySetアプリケーションの起動時に を使用してオブジェクトを保存し、アプリケーションのライフサイクル全体を通じて他の複数のスレッドがそのオブジェクトにアクセスできるようにすることができます。この間に新しい状態またはオブジェクトが到着すると、Set新しい配列を作成するという犠牲を払って、それもこの状態に追加される可能性があります。知っておくべき最も重要なことの 1 つは、CopyOnWriteArraySetそれが を使用して実装されていることですCopyOnWriteArrayList。これは、CopyOnWriteArraySetの基本的なプロパティもすべて共有していることを意味しますCopyOnWriteArrayList。覚えておくべきもう 1 つの重要な点は、このコレクション クラスのイテレータが をサポートしていないことですremove()。統合中に要素を削除しようとすると、外れ値が発生しますUnsupportedOperationException。これは、クロール中の速度を確保するために行われます。Setイテレータを使用してこの実装を走査すると、かなり高速になり、他のスレッドからの干渉が回避されます。イテレータは動作するために、イテレータの作成時に取得された配列のスナップショットに依存します。つまり、オブジェクトの追加、設定、または削除時にコピーできるほど小さいCopyOnWriteArraySet場合に使用しますset。主な目的は、散発的に更新されるデータを読み取ることです。また、反復中に要素を削除する場合は、この実装を使用しないでください。以下に示すように 、その反復子は をサポートしておらずremove()、 をスローするためです。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これは、特に 1 つのスレッドがサブスクライバーを追加し、別のスレッドが更新を処理できるマルチスレッド環境では、良い選択です。
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およびインターフェイス を実装するSetだけでなく、JDK 1.5 で追加されたSet'a, . 'の別のカスタム実装も実装しますEnumSet。また、すべての操作にSet内部を使用するものでもあります。CopyOnWriteArrayListしたがって、このクラスと同じ基本プロパティを共有します。ではないためSortedSet、反復中の要素の順序は保証されません。 Java で CopyOnWriteArraySet を使用する方法と例 (翻訳) - 2
  1. CopyOnWriteArraySet次のような用途に最適です。

    • Setのサイズは小さいままになる傾向があります。
    • 操作は、read-onlyオブジェクトを変更する操作よりも大幅に優れています。
    • トラバーサル中のスレッド間の干渉を防ぐ必要がありますSet
  2. もう 1 つの利点はCopyOnWriteArraySet、スレッドの安全性です。このコレクションは同時実行をサポートします。
  3. 変更操作 (追加、変更、削除など) は、通常、基礎となる配列全体のコピーが必要となるため、コストがかかります。
  4. イテレータは、変更可能な削除操作をサポートしていません。
  5. イテレータを使用したトラバースは非常に高速であり、その実行中に他のスレッドの干渉が排除されます。イテレータは動作するために、イテレータの作成時に取得された配列のスナップショットに依存します。
Java での使用法については以上ですCopyOnWriteArraySet。先ほども言いましたが、彼は弟ですCopyOnWriteArrayList。したがって、少なくとも 1 つを理解していれば、もう 1 つを使用することができます。唯一の違いは、一方がList'' で、もう一方Setが '' であることです。そのため、Java でこれらのデータ構造間の相違点をすべて継承する必要があります。たとえば、List要素の順序は重要であり、重複が含まれる場合があります。順序付けされていない間はSet、オブジェクトの重複は許可されません。CopyOnWriteArraySetこれは専門的なクラスであることを常に忘れないでくださいCollection。条件が良好な場合にのみ使用してください。それ以外の場合は、汎用の実装を使用できます。たとえば、HashSetLinkedHashSet同期コレクション クラスなどです。オリジナル: Java で CopyOnWriteArraySet を使用する方法と例
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION