源码剖析之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:
[url]http://wangxinchun.iteye.com/blog/1872212[/url] 的实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值