Java中的CopyOnWriteArraySet使用和实现原理
来源:互联网 发布:淘宝宝贝详情文字描述 编辑:程序博客网 时间:2024/04/30 13:32
前文转载过一遍博文关于CopyOnWriteArrayList使用,地址在:http://blog.csdn.net/dax1n/article/details/69396373
CopyOnWriteArraySet也是一个Copy-On-Write容器,关于Copy-On-Write容器不懂看http://blog.csdn.net/dax1n/article/details/69396373。
文本将学习一下CopyOnWriteArraySet的使用和原理实现,CopyOnWriteArraySet是一个支持并发访问的容器,接下来我们就看看其使用和实现:
public class CopyOnWriteArraySetMain {public static void main(String[] args) {CopyOnWriteArraySet<Integer> cset = new CopyOnWriteArraySet<>();Integer in = new Integer(1);cset.add(in);cset.add(2);cset.add(3);cset.add(4);cset.add(5);System.out.println(cset.size());}}
接下来看看add实现:
public boolean add(E e) { return al.addIfAbsent(e); }
al是CopyOnWriteArraySet的一个成员:
public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements java.io.Serializable { private static final long serialVersionUID = 5457747651344034263L; private final CopyOnWriteArrayList<E> al; //声明al /** * Creates an empty set. */ public CopyOnWriteArraySet() { al = new CopyOnWriteArrayList<E>(); //初始化al } //省略部分代码}
所以接下来我们就看看java.util.concurrent.CopyOnWriteArrayList.addIfAbsent(E)实现:
public boolean addIfAbsent(E e) {//这个方法容器如果存在则直接返回,不存在的话在执行添加 Object[] snapshot = getArray(); //indexOf方法:是在snapshot数组的0到snapshot.length搜索元素e,如果不存在返回false,否则执行addIfAbsent方法 return indexOf(e, snapshot, 0, snapshot.length) >= 0 ? false : addIfAbsent(e, snapshot); }
java.util.concurrent.CopyOnWriteArrayList.indexOf(Object, Object[], int, int)方法作用: 是在snapshot数组的0到snapshot.length搜索元素e,如果不存在返回false,否则执行addIfAbsent方法,所以indexOf如果找到了元素就直接返回false不再添加(因为Set中不允许有重复元素).如果没有找到的话调用:java.util.concurrent.CopyOnWriteArrayList.addIfAbsent(E, Object[])
接下来看看java.util.concurrent.CopyOnWriteArrayList.addIfAbsent(E, Object[])实现:
private boolean addIfAbsent(E e, Object[] snapshot) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] current = getArray(); int len = current.length; if (snapshot != current) { // Optimize for lost race to another addXXX operation int common = Math.min(snapshot.length, len); for (int i = 0; i < common; i++) if (current[i] != snapshot[i] && eq(e, current[i])) return false; if (indexOf(e, current, common, len) >= 0) return false; } Object[] newElements = Arrays.copyOf(current, len + 1); newElements[len] = e; setArray(newElements); return true; } finally { lock.unlock(); } }
使用java.util.concurrent.CopyOnWriteArrayList.lock锁完成并发控制。
总结:
CopyOnWriteArraySet的实现是借助CopyOnWriteArrayList实现的,只不过CopyOnWriteArraySet是在CopyOnWriteArrayList上使用indexOf不允许存入重复元素,正好符合Set的特性!
0 0
- Java中的CopyOnWriteArraySet使用和实现原理
- 使用 CopyOnWriteArrayList 和 CopyOnWriteArraySet
- Java中的Copy-On-Write容器,CopyOnWriteArrayList和CopyOnWriteArraySet
- Java多线程”JUC”集合中的CopyOnWriteArraySet
- JAVA多线程 之 CopyOnWriteArrayList和CopyOnWriteArraySet
- Java多线程--并发中集合的使用之CopyOnWriteArraySet
- 乱弹java并发(三)-- CopyOnWriteArrayList和CopyOnWriteArraySet
- java.util.concurrent.CopyOnWriteArraySet
- Java中CopyOnWriteArraySet
- Java集合--CopyOnWriteArraySet
- Java多线程----CopyOnWriteArraySet
- CopyOnWriteArrayList和CopyOnWriteArraySet
- HashSet和CopyOnWriteArraySet
- CopyOnWriteArraySet
- CopyOnWriteArraySet
- CopyOnWriteArraySet
- Android java中的ArrayList的原理和实现
- java.util.concurrent.CopyOnWriteArrayList CopyOnWriteArraySet
- 添加Fragment报已有父view,需先移除的错
- POJ 3007-Organize Your Train part II(hash-字符串)
- Android Studio关于SVN的相关配置及从SVN检出项目
- 用parcel解决intent传递大数据
- java线程安全问题之静态成员变量、实例成员变量、局部变量
- Java中的CopyOnWriteArraySet使用和实现原理
- break continue 在 for循环和 switch 的 不同
- adb常用命令
- 机器学习的大局观:使用神经网络和TensorFlow来对文本分类
- 关于tinker自动生成application失败的问题
- 什么是依赖注入
- 终于“比较”完美地解决了Linux下的字体问题
- UEditor控件的图片无法正常缩放(“大坑”)
- Android 通过反射调用获取内置存储和外置sd卡根路径(适用于各个版本)