ソースコード解析のCopyOWriteAraySet


CopyOWriteAraySet:CopyOnWriteArayListに基づく実現です。ただ、添付する前に、関連記録が既に保存されているかどうかを判断します。
このセットの実現は普通の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の実装。