java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍
发布日期:2021-07-01 01:39:31 浏览次数:3 分类:技术文章

本文共 1995 字,大约阅读时间需要 6 分钟。

转载自  

 

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

CopyOnWriteArraySet简介

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

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

我们看一下CopyOnWriteArraySet的类体:

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

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

ConcurrentSkipListSet简介

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

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

(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的时候再细说。

 

转载地址:https://maokun.blog.csdn.net/article/details/80617876 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:非阻塞线程安全列表——ConcurrentLinkedDeque应用举例
下一篇:Java并发包:ConcurrentMap

发表评论

最新留言

不错!
[***.144.177.141]2024年04月10日 01时22分28秒