本文介绍并发Set,有几点说明:
- 其在Java容器中的划分位置见[1]
- 根接口为Set,其内元素允许为
NULL
- 并发Set的常见使用场景不太用到迭代器,故本文对迭代器不作深入叙述
- 如果实在不行,可用并发Map实现并发Set的功能,只要将“键值”取为某个特殊值即可
- 接下来介绍其常见的两个子类:
- CopyOnWriteArraySet
- SynchronizedSet
接下来对具体实现子类的介绍,主要基于以下几个维度:
- 是否有界,分为“设计是否有界”和“实际是否有界”,实际有“设计有界,实际有界”,“设计无界,实际无界”和“设计无界,实际有界,可称为假性无界”这3种情况
- 底层数据结构基于“数组”,还是“链表”
- 实现操作的线程安全策略
- 生成的迭代器性质[1]
一、CopyOnWriteArraySet
1、核心原理
- 基于
CopyOnWriteArrayList
- 有界性与
CopyOnWriteArrayList
一致 - 实现操作的线程安全策略借助于
CopyOnWriteArrayList
- 生成的迭代器就是所基于
CopyOnWriteArrayList
生成的迭代器 - 由于基于
CopyOnWriteArrayList
,所以其增删改查操作的时间复杂度劣于HashSet
2、构造参数
Collection<? extends E> c
:初始化元素来源集合
二、SynchronizedSet
java.util.Collections
类中的内部类。
1、核心原理
- 基于所传入的Set实例,有界性也依赖于它
- 使用
synchronized
实现操作的线程安全,故属于同步容器
- 生成所传入Set实例的迭代器,故迭代器性质须具体情况具体分析
2、构造参数
Set<E> s
:SynchronizedSet实例所基于的底层Set实例,注意其跟“初始化元素来源集合”不一样,后者在复制后就不再有关联Object mutex
:传入的锁对象
参考文献
[1]《Java容器》