CopyOnWriteArraySet
こちらはクラスの弟です
CopyOnWriteArrayList
。これらは、より一般的なクラスとともに、JDK 1.5 で追加された特殊なクラスのセットです
ConcurrentHashMap
。
concurrent collection framework
これらはパッケージの一部であり、パッケージ内にあります
java.util.concurrent
。
CopyOnWriteArraySet
変更操作が発生した場合にコピーできるサイズの小さい読み取り専用コレクションに最適です。たとえば、
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;
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
およびインターフェイス を実装する
Set
だけでなく、JDK 1.5 で追加された
Set
'a, . 'の別のカスタム実装も実装します
EnumSet
。また、すべての操作に
Set
内部を使用するものでもあります。
CopyOnWriteArrayList
したがって、このクラスと同じ基本プロパティを共有します。ではないため
SortedSet
、反復中の要素の順序は保証されません。
-
CopyOnWriteArraySet
次のような用途に最適です。
Set
のサイズは小さいままになる傾向があります。
- 操作は、
read-only
オブジェクトを変更する操作よりも大幅に優れています。
- トラバーサル中のスレッド間の干渉を防ぐ必要があります
Set
。
- もう 1 つの利点は
CopyOnWriteArraySet
、スレッドの安全性です。このコレクションは同時実行をサポートします。
- 変更操作 (追加、変更、削除など) は、通常、基礎となる配列全体のコピーが必要となるため、コストがかかります。
- イテレータは、変更可能な削除操作をサポートしていません。
- イテレータを使用したトラバースは非常に高速であり、その実行中に他のスレッドの干渉が排除されます。イテレータは動作するために、イテレータの作成時に取得された配列のスナップショットに依存します。
Java での使用法については以上です
CopyOnWriteArraySet
。先ほども言いましたが、彼は弟です
CopyOnWriteArrayList
。したがって、少なくとも 1 つを理解していれば、もう 1 つを使用することができます。唯一の違いは、一方が
List
'' で、もう一方
Set
が '' であることです。そのため、Java でこれらのデータ構造間の相違点をすべて継承する必要があります。たとえば、
List
要素の順序は重要であり、重複が含まれる場合があります。順序付けされていない間は
Set
、オブジェクトの重複は許可されません。
CopyOnWriteArraySet
これは専門的なクラスであることを常に忘れないでください
Collection
。条件が良好な場合にのみ使用してください。それ以外の場合は、汎用の実装を使用できます。たとえば、
HashSet
、
LinkedHashSet
同期コレクション クラスなどです。オリジナル:
Java で CopyOnWriteArraySet を使用する方法と例
GO TO FULL VERSION