ソースコード解析のCopyOWriteAraySet
CopyOWriteAraySet:CopyOnWriteArayListに基づく実現です。ただ、添付する前に、関連記録が既に保存されているかどうかを判断します。
このセットの実現は普通のHashSetとはだいぶ違っています。HashSetはHashMapによる実現である。実現の観点からCopyOWriteAraySetが見られます。 の使用条件とリストの血が近く、使うシーンも近い!
これは以下の特徴を持つアプリケーションに最適です。
setサイズは通常小さいままで、読み取り専用の操作は可変操作よりはるかに多く、巡回中にスレッド間の衝突を防ぐ必要があります。
スレッドが安全です。
基本配列全体をコピーする必要があるため、可変動作(add、set、removeなど)のオーバーヘッドが大きい。
ローズマリーは可変remove操作をサポートしていません。
ローズマリーを使用して遍歴する速度が速く、他のスレッドと衝突することはありません。ローズマリーを作成するときは、ローズマリーは不変の配列スナップショットに依存します。
http://wangxinchun.iteye.com/blog/1872212の実装。
このセットの実現は普通のHashSetとはだいぶ違っています。HashSetはHashMapによる実現である。実現の観点からCopyOWriteAraySetが見られます。 の使用条件とリストの血が近く、使うシーンも近い!
これは以下の特徴を持つアプリケーションに最適です。
setサイズは通常小さいままで、読み取り専用の操作は可変操作よりはるかに多く、巡回中にスレッド間の衝突を防ぐ必要があります。
スレッドが安全です。
基本配列全体をコピーする必要があるため、可変動作(add、set、removeなど)のオーバーヘッドが大きい。
ローズマリーは可変remove操作をサポートしていません。
ローズマリーを使用して遍歴する速度が速く、他のスレッドと衝突することはありません。ローズマリーを作成するときは、ローズマリーは不変の配列スナップショットに依存します。
public class CopyOnWriteArraySet<E> extends AbstractSet<E>
implements java.io.Serializable {
private static final long serialVersionUID = 5457747651344034263L;
// , CopyOnWriteArrayList
private final CopyOnWriteArrayList<E> al;
/**
* Creates an empty set.
*/
public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList<E>();
}
/**
* Creates a set containing all of the elements of the specified
* collection.
*
* @param c the collection of elements to initially contain
* @throws NullPointerException if the specified collection is null
*/
public CopyOnWriteArraySet(Collection<? extends E> c) {
al = new CopyOnWriteArrayList<E>();
// list
al.addAllAbsent(c);
}
/*
CopyOnWriteArrayList
*/
public int size() {
return al.size();
}
public boolean isEmpty() {
return al.isEmpty();
}
public boolean contains(Object o) {
return al.contains(o);
}
public Object[] toArray() {
return al.toArray();
}
/**
*/
public <T> T[] toArray(T[] a) {
return al.toArray(a);
}
public void clear() {
al.clear();
}
public boolean remove(Object o) {
return al.remove(o);
}
public boolean add(E e) {
// CopyOnWriteArrayList
return al.addIfAbsent(e);
}
。。。。。。。。。
/**
* CopyOnWriteArrayList
*/
public Iterator<E> iterator() {
return al.iterator();
}
}
詳細はCopyOWriteArayListを参照してください。http://wangxinchun.iteye.com/blog/1872212の実装。