目录

  • `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. android 原生分享界面_索尼PlayStation App获得语音聊天功能和新的UI界面
  2. WinForm 之 程序退出
  3. 插件式架构设计实践一:插件式系统架构设计简介
  4. 训练神经网络的一些技巧(包括激活和损失函数的选择、调参、过拟合等)
  5. 【李宏毅2020 ML/DL】P80 Generative Adversarial Network | Feature Extraction
  6. k-d tree学习总结
  7. java线程知识点拾遗(CAS)
  8. 应用开发之Linq和EF
  9. 保障电邮EMAIL通讯的安全性
  10. [CM311-1A]-全网最全 Android 用户管理及用户应用权限
  11. Module not found: Error: Can‘t resolve ‘vue-router‘ in
  12. 简单动态网站的搭建流程
  13. 海伦公式c语言double,海伦公式
  14. windows自带截图键(ctrl + win + s)失灵如何恢复,无需重启电脑方法!
  15. sap采购定价过程配置
  16. 20年磨一剑,南京大学周志华团队出版专著总结演化学习引领性研究(再次送书)...
  17. VMware虚拟机安装macos Big Sur 11.1.0 (20C69)镜像CDR/ISO下载
  18. mdev动态创建插入硬件设备
  19. uniapp 多语言版本demo in18
  20. 湘潭大学计算机科学与技术录取分数线,计算机科学与技术专业分数线各大学排名(湖南)...

热门文章

  1. mysql和oracle的时间字段区别_Oracle数据库中关于日期和时间字段类型
  2. mysql initialsize,单机数据库优化
  3. 卷积神经网络CNN基本原理和相关基本概念
  4. 机器学习算法性能评价,改进的理论基础以及改进措施
  5. 驱动兼容_「图」英特尔DCH驱动新版发布:重点修复Windows 10兼容性问题
  6. JAVA设计模式之模板方法模式-场景、例子、深入
  7. libsvm python Linux Ubuntu下编程操作实践
  8. 计算机网络超详细笔记(二):物理层
  9. python list平均数_数据分析之Python干货笔记
  10. 使用WWWGrep检查你的网站元素安全