源码剖析之CopyOnWriteArraySet

CopyOnWriteArraySet :是基于CopyOnWriteArrayList 的实现。只是在添加之前先判断是否已经存储相关记录。

注意:此Set的实现和普通的HashSet 已经相差甚远了。HashSet 是基于HashMap的实现。 从实现的角度就能看出CopyOnWriteArraySet  的使用条件和list的血缘更近,使用的场景也更近!!


它最适合于具有以下特征的应用程序:
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();
    }

  
}


更多 详细内容请参考 CopyOnWriteArrayList:
http://wangxinchun.iteye.com/blog/1872212 的实现。

你可能感兴趣的:(java,多线程,set)