0%

并发Set

本文介绍并发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容器》

您的支持将鼓励我继续分享!