目录

  • `CopyOnWriteArraySet` 类图
  • `CopyOnWriteArraySet` 简介
  • `CopyOnWriteArraySet` 源码
    • `CopyOnWriteArraySet` 的构造器
    • `CopyOnWriteArraySet` 的添加元素(独占锁 `ReentrantLock`)
    • `CopyOnWriteArraySet` 的移除元素(独占锁 `ReentrantLock`)
    • `CopyOnWriteArraySet` 的获取元素

CopyOnWriteArraySet 类图

CopyOnWriteArraySet 简介

  • CopyOnWriteArraySet 继承于 AbstractSet,这就意味着它是一个集合。并且是线程安全的
  • CopyOnWriteArraySet 是通过 CopyOnWriteArrayList 实现的。而CopyOnWriteArrayList 本质是个动态数组,所以 CopyOnWriteArraySet 相当于通过通过动态数组实现的“集合”!
  • CopyOnWriteArrayList 中允许有重复的元素;但是 CopyOnWriteArraySet 是一个集合,所以它不能有重复元素。因此,CopyOnWriteArrayList 额外提供了 addIfAbsent()addAllAbsent() 这两个添加元素的 API,通过这些 API 来添加元素时,只有当元素不存在时才执行添加操作!
  • CopyOnWriteArraySet 的“线程安全”机制,和 CopyOnWriteArrayList 一样,是通过 volatileReentrantLock(独占锁) 来实现的

CopyOnWriteArraySet 源码

CopyOnWriteArraySet 的构造器

public class CopyOnWriteArraySet<E> extends AbstractSet<E>implements java.io.Serializable {private final CopyOnWriteArrayList<E> al;// 无参构造器public CopyOnWriteArraySet() {// 创建了一个 CopyOnWriteArrayList 对象al = new CopyOnWriteArrayList<E>();}// 有参构造器public CopyOnWriteArraySet(Collection<? extends E> c) {if (c.getClass() == CopyOnWriteArraySet.class) {@SuppressWarnings("unchecked") CopyOnWriteArraySet<E> cc =(CopyOnWriteArraySet<E>)c;al = new CopyOnWriteArrayList<E>(cc.al);}else {al = new CopyOnWriteArrayList<E>();al.addAllAbsent(c);}}
}

CopyOnWriteArraySet 的添加元素(独占锁 ReentrantLock)

public boolean add(E e) {// 调用CopyOnWriteArrayList的当不存在时添加方法return al.addIfAbsent(e);
}// 不存在才会添加
public boolean addIfAbsent(E e) {Object[] snapshot = getArray();return indexOf(e, snapshot, 0, snapshot.length) >= 0 ? false :addIfAbsent(e, snapshot);
}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) {// 说明在这之前已经被修改过了int common = Math.min(snapshot.length, len);// 判断元素是否存在于当前数组中,如果存在直接返回false;// 这里巧妙地思路:判断两个数组相等 1长度相等 2数组每一位相等 不需要进行双重循环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();// 解锁}
}

CopyOnWriteArraySet 的移除元素(独占锁 ReentrantLock)

public boolean remove(Object o) {// 调用CopyOnWriteArrayList的 remove()return al.remove(o);
}public boolean remove(Object o) {Object[] snapshot = getArray();int index = indexOf(o, snapshot, 0, snapshot.length);return (index < 0) ? false : remove(o, snapshot, index);
}private boolean remove(Object o, Object[] snapshot, int index) {// 使用独占锁final ReentrantLock lock = this.lock;lock.lock();try {Object[] current = getArray();int len = current.length;if (snapshot != current) findIndex: {int prefix = Math.min(index, len);for (int i = 0; i < prefix; i++) {if (current[i] != snapshot[i] && eq(o, current[i])) {index = i;break findIndex;}}if (index >= len)return false;if (current[index] == o)break findIndex;index = indexOf(o, current, index, len);if (index < 0)return false;}Object[] newElements = new Object[len - 1];System.arraycopy(current, 0, newElements, 0, index);System.arraycopy(current, index + 1,newElements, index,len - index - 1);setArray(newElements);return true;} finally {lock.unlock();}
}

CopyOnWriteArraySet 的获取元素

public Iterator<E> iterator() {// 调用CopyOnWriteArrayList的 iterator()return al.iterator();
}public Iterator<E> iterator() {return new COWIterator<E>(getArray(), 0);
}

Set集合之CopyOnWriteArraySet相关推荐

  1. java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍

    转载自  java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍 这一节我们来接着介绍JUC集合:CopyOnWrite ...

  2. cad的lisp程序大集合_大数据成神之路-Java高级特性增强(CopyOnWriteArraySet)

    大数据成神之路 大数据成神之路: 点我去成神之路系列目录^_^ 预计更新500+篇文章,已经更新40+篇~ 本系列的大纲会根据实际情况进行调整,欢迎大家关注~ 导语 CopyOnWriteArrayS ...

  3. JUC之线程安全的集合

    目录 演示ArrayList的线程不安全性: 线程安全的List集合第一种:Vector: 线程安全的List集合第二种:Collections.synchronizedList(List list) ...

  4. 死磕 java集合之终结篇

    概览 我们先来看一看java中所有集合的类关系图. 这里面的类太多了,请放大看,如果放大还看不清,请再放大看,如果还是看不清,请放弃. 我们下面主要分成五个部分来逐个击破. List List中的元素 ...

  5. Java高并发编程:同步工具类

    内容摘要 这里主要介绍了java5中线程锁技术以外的其他同步工具,首先介绍Semaphore:一个计数信号量.用于控制同时访问资源的线程个数,CyclicBarrier同步辅助类:从字面意思看是路障, ...

  6. 1-23 Socket编程

    Future接口 Future:表示将要完成的任务的结果 PS:Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callable一边在任务执行成功或失败之后做出相应操作 主要方 ...

  7. Java工程师只要掌握这些知识点,就能给面试官一个满意的答案,挑战高薪

    以下是我花时间整理的 java各类知识面相关的比较好的博文,如果你是去一家公司面试,无论你是刚入行,还是有多年开发经验,好好掌握学习一下比较好,.毕竟对于面试官来说,如果他问的问题,你回答不上来,肯定 ...

  8. Java并发与多线程

    1.多线程优点 资源利用率更好:文件读写操作 程序设计在某些情况下更简单: 程序响应更快:端口监听操作 2.多线程的代价 设计更复杂:多线程共享数据时尤其需要注意 上下文切换的开销: CPU 会在一个 ...

  9. 每日一记 - 3.6

    八股相关 一.具体问题 (Java 语言)1. Object 类知道多少方法? (Java 语言)2. 普通的集合类是线程安全的吗? (数据库)3. Mybatis 是怎么做到防止 SQL 注入的? ...

  10. 深读源码-java集合类总结篇

    概览 我们先来看一看java中所有集合的类关系图. 这里面的类太多了,请放大看,如果放大还看不清,请再放大看,如果还是看不清,请放弃. 我们下面主要分成五个部分来逐个击破. List List中的元素 ...

最新文章

  1. python海龟画笔如何运行_Python海龟绘图:turtle的简单使用
  2. BZOJ1975[Sdoi2010]魔法猪学院——可持久化可并堆+最短路树
  3. 【DIY】200521近期在做的项目小结,DIY进展汇报
  4. 福昕阅读器drm加密解密总结
  5. Windows Mobile下使用CppUnitLite输出测试结果
  6. shell读取文件并且遍历输出
  7. python大纲_python学习大纲
  8. json转excel_手写JAVA实现个性化业务的Excel转JSON,效率提高99.99%
  9. Hadoop基础-HDFS安全管家之Kerberos实战篇
  10. python简单爬虫代码-最精简的爬虫 --仅需4行代码(python)
  11. 虚拟机 网卡模式配置
  12. 优秀产品经理都是这样写周报的(顺便分享个周报模板)
  13. 关于 FleaPHP
  14. SAM-BA AT91 USB to Serial converter驱动安装失败解决方法
  15. warning:discards qualifiers from pointer target type解决办法
  16. 塔防三国志服务器维护时间,塔防三国志中期玩家教程攻略详解
  17. (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  18. 企业微信怎么统计客户数量
  19. 好用的android app,6款好用的Android手机App
  20. 大学毕业不用愁,一系列软件帮你轻松完成毕业论文

热门文章

  1. 非递归二叉树的序列打印
  2. python中的__file__、os.path.realpath(__file__)、os.path.dirname(os.path.realpath(__file__))
  3. java调用matlab的jar包
  4. 计算机显微视觉相关概念,计算机视觉热门科研!基于深度神经网络的蛋白质智能显微分类系统,已开启!...
  5. 凸优化第九章无约束优化 9.4最速下降方法
  6. 一段有趣的python小代码(将numpy中的数组转化为可哈希的字典)
  7. 自豪地采用WordPress,如何删除链接?
  8. Red-Detector扫描你EC2实例中的安全漏洞
  9. Raki的统计学习方法笔记0x2章:感知机
  10. SQL Server系统表sysobjects介绍