讲师中心 微信公众号
AI工具推荐 视频效率加速

详解CopyOnWriteArraySet在并发读多写少场景应用

老浩吖_5568

老浩吖_5568

发布时间:2026-04-02 14:41:19

|

570人浏览过

|

来源于php中文网

原创

CopyOnWriteArraySet适合读多写少场景,因其读操作无锁高性能,写操作通过复制数组实现线程安全,但开销大、内存高、不支持null且弱一致性。

详解copyonwritearrayset在并发读多写少场景应用

CopyOnWriteArraySet 是 Java 并发包(java.util.concurrent)中一个线程安全的 Set 实现,底层基于 CopyOnWriteArrayList 构建。它特别适合“读多写少”的并发场景——即多个线程频繁读取、极少修改集合内容的使用模式。

为什么 CopyOnWriteArraySet 适合读多写少?

它的核心机制是“写时复制”(Copy-On-Write):每次添加、删除或更新元素时,并不直接修改原数组,而是先复制一份新数组,在新数组上完成操作,再用原子方式替换原引用。这意味着:

  • 读操作(如 contains()、iterator()、size())完全无锁,也不阻塞其他读线程,性能极高;
  • 写操作(如 add()、remove())开销较大——涉及数组复制、对象创建和 volatile 引用更新,且会阻塞其他写操作;
  • 迭代器是快照式的,不会抛出 ConcurrentModificationException,但看不到写操作的最新结果(弱一致性)。

典型适用场景举例

以下情况可优先考虑 CopyOnWriteArraySet:

  • 监听器/观察者列表:例如事件总线中注册的监听器集合,通常初始化后很少增删,但每次事件触发都要遍历通知;
  • 配置白名单或黑名单:如 IP 白名单集合,加载后长期只读,仅运维偶尔动态更新;
  • 缓存中的活跃会话 ID 集合:大量查询是否存在某会话,新增/下线频率远低于查询频率。

使用时需注意的关键细节

它不是万能替代品,误用反而降低性能或引发逻辑问题:

  • 不支持 null 元素:调用 add(null) 会直接抛出 NullPointerException;
  • 不保证实时可见性:写操作完成后,正在执行的迭代器仍遍历旧快照,新线程读取才可见;
  • 内存占用较高:每次写操作都复制整个底层数组,集合大、写频繁时易引发 GC 压力;
  • 不支持批量写入优化:如 addAll() 仍是逐个 add,无法合并为一次复制。

对比其他线程安全 Set 的选择建议

若场景不符合“读远多于写”,应考虑更合适的方案:

  • 读写均衡或写较多 → 用 Collections.synchronizedSet(new HashSet()) 或 ConcurrentHashMap.newKeySet()(JDK 8+);
  • 需要强一致性 + 高并发写 → 优先选 ConcurrentSkipListSet(基于跳表,支持排序与并发修改);
  • 仅需简单存在性判断且允许一定延迟 → 可用 ConcurrentHashMap 模拟(map.put(key, Boolean.TRUE)),空间和性能更优。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

2090

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

143

2025.11.30

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

529

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1658

2024.03.01

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

694

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3638

2023.08.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

450

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

323

2025.11.16

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn