CopyOnWriteArraySet 是基于写时复制的线程安全 Set,读操作无锁高性能,适合读多写少场景;而 Collections.synchronizedSet 读写互斥、吞吐量低。

CopyOnWriteArraySet 是 Java 并发包(java.util.concurrent)中提供的线程安全的 Set 实现,底层基于 CopyOnWriteArrayList,适用于读多写少的场景。
为什么用 CopyOnWriteArraySet 而不是 HashSet + Collections.synchronizedSet?
它内部不加锁,而是通过“写时复制”(Copy-On-Write)机制实现线程安全:每次修改(add/remove)都会创建新数组并替换引用,读操作永远访问不可变快照,因此读操作无锁、高性能、不会阻塞。而 Collections.synchronizedSet 对所有操作加同一把锁,读写互斥,吞吐量低。
基本用法:声明与初始化
直接 new 即可,无需额外同步:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<>();
也可以用其他集合初始化:
立即学习“Java免费学习笔记(深入)”;
Set<String> init = Set.of("a", "b");
CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<>(init);
关键行为与注意事项
- add() 和 remove() 是线程安全的,但每次修改都触发数组复制,开销较大 —— 不适合高频写入场景
-
迭代器弱一致性:遍历时不会抛
ConcurrentModificationException,但看不到迭代开始后新增/删除的元素(看到的是创建迭代器那一刻的快照) -
不支持 null 元素:插入 null 会抛
NullPointerException - contains() 是 O(n) 时间复杂度,因为底层是数组+线性查找(没有哈希表结构),大数据量时性能不如 ConcurrentHashMap + keySet
适用典型场景
- 监听器/观察者列表:注册和注销频率低,遍历通知频繁(如事件总线中的 listeners)
- 配置白名单、状态标记集合:内容稳定,只偶尔更新
- 替代 volatile Set 的“伪线程安全”写法,避免手动同步

















