这一节我们来接着介绍JUC集合:CopyOnWriteArraySet和ConcurrentSkipListSet。从名字上来看我们知道CopyOnWriteArraySet与上一节讲到的CopyOnWriteArrayList一样是动态数组实现;ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。下面我们深入细致的分析一下他们的用法。

CopyOnWriteArraySet简介

它是线程安全的无序的集合,可以将它理解成线程安全的HashSet。对其所有操作使用内部 CopyOnWriteArrayList 的 Set。因此,它共享以下相同的基本属性:

  1. 它最适合于具有以下特征的应用程序:set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
  2. 它是线程安全的。
  3. 因为通常需要复制整个基础数组,所以可变操作(add、set 和 remove 等等)的开销很大。 迭代器不支持可变 remove操作。
  4. 使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。

我们看一下CopyOnWriteArraySet的类体:

public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements Serializable {
private static final long serialVersionUID = 5457747651344034263L;
private final CopyOnWriteArrayList<E> al = new CopyOnWriteArrayList();
}

该类有一个成员变量CopyOnWriteArrayList。CopyOnWriteArraySet其所有操作使用内部 CopyOnWriteArrayList 的 Set,所以他的所有的方法其实都是引用了CopyOnWriteArrayList的方法来完成的。有关CopyOnWriteArrayList的使用说明我们在上一节里已经介绍的很详细,有兴趣可以查看上一节里的源码介绍。

ConcurrentSkipListSet简介

ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。他是一个基于 ConcurrentSkipListMap 的可缩放并发 NavigableSet 实现。下面我们看一下方法体:

public class ConcurrentSkipListSet<E>
extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable { private static final long serialVersionUID = -2479143111061671589L; private final ConcurrentNavigableMap<E,Object> m; public ConcurrentSkipListSet() {
m = new ConcurrentSkipListMap<E,Object>();
} }

(01) ConcurrentSkipListSet继承于AbstractSet。因此,它本质上是一个集合。

(02) ConcurrentSkipListSet实现了NavigableSet接口。因此,ConcurrentSkipListSet是一个有序的集合。

(03) ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的。它包含一个ConcurrentNavigableMap对象m,而m对象实际上是ConcurrentNavigableMap的实现类ConcurrentSkipListMap的实例。ConcurrentSkipListMap中的元素是key-value键值对;而ConcurrentSkipListSet是集合,它只用到了ConcurrentSkipListMap中的key!

由源码中我们能看到ConcurrentSkipListSet内部所有操作都是在内部由ConcurrentSkipListMap完成。本节我们先不介绍ConcurrentSkipListMap,下节讲到map的时候再细说。

最新文章

  1. string.Format格式化用法详解
  2. 初识Hibernate 缓存
  3. 解决:“java.lang.IllegalArgumentException: error at ::0 can&#39;t find referenced pointcut myMethod”问题!
  4. 构建Docker+Jenkins持续集成环境
  5. Linux 中文乱码问题
  6. Ajax 用法
  7. How to save/read file on different platforms
  8. C++ 顶层 const
  9. Google Play和基于Feature的过滤 —— Feature 参考手册
  10. 论文阅读笔记四十七:Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression(CVPR2019)
  11. LeetCode算法题-Invert Binary Tree
  12. div界面浮动插件
  13. NET 架构指南频道
  14. 如何使用 OpenFileDialog 组件 (选择文件组件)
  15. javascript 与vbscript 互相调用
  16. linux文件系统命令(6)---touch和mkdir
  17. php接入域账号登陆代码
  18. ActiveMQ教程(消息发送和接受)
  19. VUE 方法
  20. servlet 简单filter避免中文乱码等

热门文章

  1. vue computed监听多个属性
  2. Java连载5-标识符、关键字和字面值
  3. 在vue项目中遇到关于对象的深浅拷贝问题
  4. C# Linq 笛卡尔积
  5. redis集群(单机6节点实现)
  6. 个人永久性免费-Excel催化剂功能第21波-Excel与Sqlserver零门槛交互-执行SQL语句篇
  7. Java map笔记
  8. Error:Failed to resolve: com.android.support:support-annotations:26.0.2
  9. RecyclerView下拉加载集合越界问题
  10. [leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal (Medium)