前言
上一篇文章介绍了CopyOnWriteArrayList的实现原理和应用场景,CopyOnWriteArraySet是基于CopyOnWriteArrayList来实现的,本篇文章简单介绍下CopyOnWriteArraySet的实现和具体应用。
实现原理
1. CopyOnWriteArraySet继承于AbstractSet,这就意味着它是一个集合
2. CopyOnWriteArraySet包含CopyOnWriteArrayList对象,它是通过CopyOnWriteArrayList实现的,而CopyOnWriteArrayList本质是个动态数组队列
3. 所以CopyOnWriteArraySet相当于通过通过动态数组实现的“集合”!
4. CopyOnWriteArrayList中允许有重复的元素;但是,CopyOnWriteArraySet是一个集合,所以它不能有重复集合
5. 因此,CopyOnWriteArrayList额外提供了addIfAbsent()和addAllAbsent()这两个添加元素的API,通过这些API来添加元素时,只有当元素不存在时才执行添加操作!
6. 至于CopyOnWriteArraySet的“线程安全”机制,和CopyOnWriteArrayList一样,是通过volatile和互斥锁来实现的。
源码解析
public class CopyOnWriteArraySet<E> extends AbstractSet<E>
implements java.io.Serializable {
private static final long serialVersionUID = 5457747651344034263L;
private final CopyOnWriteArrayList<E> al;
/**
* Creates an empty set.
*/
public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList<E>();
}
............
............
}
首先可以看到内部包含CopyOnWriteArrayList对象,读取和写入操作都是基于CopyOnWriteArrayList对象来实现的。
public boolean add(E e) {
return al.addIfAbsent(e);
}
add方法调用CopyOnWriteArrayList 对象al的addIfAbsent方法来实现的
/**
* Appends the element, if not present.
*
* @param e element to be added to this list, if absent
* @return {@code true} if the element was added
*/
public boolean addIfAbsent(E e) {
Object[] snapshot = getArray();
return indexOf(e, snapshot, 0, snapshot.length) >= 0 ? false :
addIfAbsent(e, snapshot);
}
方法都是基于CopyOnWriteArrayList来实现的,就不做过多介绍了;
总结:
CopyOnWriteArraySet是利用CopyOnWriteArrayList来实现的,所以CopyOnWriteArraySet也是线程安全的,应用场景:读操作远远多于写操作。