揭秘CopyOnWriteArraySet:读多写少的并发集合利器

文章目录

    • 什么是CopyOnWriteArraySet?
    • 核心原理深度剖析
      • 底层数据结构
      • 写时复制机制详解
      • 迭代器的弱一致性
    • 与其它容器的性能对比
    • 实际应用场景
      • 1. 配置信息管理
      • 2. 在线用户状态收集器
      • 3. 事件监听器管理
    • 实战案例:高并发在线用户监测
    • 局限性及注意事项
    • 总结
    • 参考文章

大家好,我是你们的技术老友科威舟,今天给大家分享一下Java JUC包中的CopyOnWriteArraySet原理。

如何在高并发读取场景中既保证线程安全又提升性能?CopyOnWriteArraySet或许正是你要找的解决方案。

在多线程编程的世界里,线程安全始终是我们需要直面的挑战。当涉及到共享集合时,这种挑战尤为突出。今天,我们要深入剖析的是一位在并发编程中不可或缺的"特长生"——CopyOnWriteArraySet。

什么是CopyOnWriteArraySet?

简单来说,CopyOnWriteArraySet是Java并发包(java.util.concurrent)中提供的一个线程安全的Set实现。它与众不同之处在于采用了"写时复制"(Copy-On-Write)策略,这意味着每次修改操作(如添加、删除元素)都会创建底层数组的一个新副本,而读操作则直接在原数组上进行。

想象一下图书馆的管理方式:当有人只想查阅书籍(读操作)时,可以直接进入书库浏览;但当需要增加或下架书籍(写操作)时,管理员会先创建一个完整的书库副本,在副本上进行修改,最后再用修改后的副本替换原始书库。这样,查阅者永远不会被阻塞,但修改操作的成本较高。

核心原理深度剖析

底层数据结构

CopyOnWriteArraySet的巧妙之处在于其内部实现:它完全依赖CopyOnWriteArrayList作为其存储结构。

publicclassCopyOnWriteArraySet<E>extendsAbstractSet<E>implementsjava.io.Serializable{// 内部使用CopyOnWriteArrayList来存储元素privatefinalCopyOnWriteArrayList<E>al;publicCopyOnWriteArraySet(){al=newCopyOnWriteArrayList<E>();}}

这里就产生了一个有趣的问题:CopyOnWriteArrayList本身允许元素重复,而Set要求元素唯一。CopyOnWriteArraySet如何解决这一矛盾?

答案是它通过调用CopyOnWriteArrayList的addIfAbsent方法来确保元素的唯一性。

写时复制机制详解

添加元素的流程体现了写时复制的精髓:

publicbooleanadd(Ee){// 调用addIfAbsent方法,确保元素不存在时才添加returnal.addIfAbsent(e);}

addIfAbsent方法内部会先检查元素是否已存在,只有在元素不存在时才会执行添加操作。添加过程需要获取可重入锁,然后创建原数组的副本,在新副本上添加元素,最后将副本设置为新的当前数组。

这一过程保证了写操作的原子性和线程安全,但代价是每次写操作都需要复制整个数组,因此写操作的性能与数组大小成正比。

迭代器的弱一致性

CopyOnWriteArraySet的迭代器具有弱一致性特征,这意味着迭代器创建时会获取当前数组的快照,在迭代过程中不会反映其他线程对集合的修改。这避免了ConcurrentModificationException异常,但代价是可能遍历到过期的数据。

publicIterator<E>iterator(){// 返回一个基于当前数组快照的迭代器returnal.iterator();}

与其它容器的性能对比

为了更直观地理解CopyOnWriteArraySet的特性,我们通过一个表格比较它与其它常见容器的区别:

特性HashSetConcurrentHashMap.KeySetViewCopyOnWriteArraySet
读性能O(1)O(1)O(n)但无锁
写性能O(1)O(1)带锁竞争O(n)复制开销
内存消耗最低中等较高(写时复制)
迭代器一致性弱一致性弱一致性强一致性(快照)
适用场景单线程环境高频读写低频写+高频读

从对比中可以看出,CopyOnWriteArraySet在读多写少的场景中具有明显优势,特别是在需要频繁遍历且写操作较少的并发环境中。

实际应用场景

1. 配置信息管理

在大型系统中,配置信息通常只在启动时加载,之后会被多个线程频繁读取,但极少修改。使用CopyOnWriteArraySet存储配置项,可以保证在高并发读取时的性能。

publicclassConfigurationManager{privatefinalCopyOnWriteArraySet<ConfigListener>listeners=newCopyOnWriteArraySet<>();// 添加配置监听器(写操作少)publicvoidaddListener(ConfigListenerlistener){listeners.add(listener);}// 通知所有监听器(读操作多)publicvoidfireConfigChanged(ConfigEventevent){for(ConfigListenerlistener:listeners){listener.onConfigChanged(event);}}}

2. 在线用户状态收集器

电商平台需要实时跟踪在线用户状态,这类场景中读取频率远高于写入频率

publicclassOnlineUserManager{privatefinalCopyOnWriteArraySet<Long>onlineUsers=newCopyOnWriteArraySet<>();// 用户登录(写操作)publicbooleanuserLogin(LonguserId){booleanadded=onlineUsers.add(userId);if(added){log.info("用户{}登录成功,当前在线人数:{}",userId,onlineUsers.size());}returnadded;}// 获取在线用户列表(读操作)publicSet<Long>getOnlineUsers(){returnCollections.unmodifiableSet(onlineUsers);}}

3. 事件监听器管理

GUI框架或事件驱动系统中,监听器通常在初始化时注册,之后主要进行遍历操作以通知事件,这正是CopyOnWriteArraySet的用武之地。

实战案例:高并发在线用户监测

以下是一个基于Spring Boot的在线用户监测系统完整示例,展示了CopyOnWriteArraySet在生产环境中的应用:

@ComponentpublicclassOnlineUserManager{privatefinalCopyOnWriteArraySet<Long>onlineUsers=newCopyOnWriteArraySet<>();privatefinalConcurrentMap<Long,Long>lastHeartbeat=newConcurrentHashMap<>();privatestaticfinallongHEARTBEAT_TIMEOUT=300_000;// 5分钟// 用户登录publicbooleanuserLogin(LonguserId){booleanresult=onlineUsers.add(userId);if(result){lastHeartbeat.put(userId,System.currentTimeMillis());}returnresult;}// 心跳保活publicvoidrefreshHeartbeat(LonguserId){if(onlineUsers.contains(userId)){lastHeartbeat.put(userId,System.currentTimeMillis());}}// 定时清理超时用户publicvoidcleanExpiredUsers(){longnow=System.currentTimeMillis();for(LonguserId:onlineUsers){LonglastTime=lastHeartbeat.get(userId);if(lastTime!=null&&now-lastTime>HEARTBEAT_TIMEOUT){onlineUsers.remove(userId);lastHeartbeat.remove(userId);}}}}

这个实现能够支持5000+ QPS的并发读取压力,同时保证用户登录/登出操作的原子性。

局限性及注意事项

尽管CopyOnWriteArraySet在特定场景下表现优秀,但它并非万能钥匙,存在以下局限性:

  1. 内存开销大:写操作需要复制整个数组,内存占用较高
  2. 实时性弱:读操作可能无法立即看到其他线程的最新修改
  3. 写性能随数据量增长而下降:不适合存储大量数据且写操作频繁的场景

总结

CopyOnWriteArraySet是Java并发包中一颗璀璨的明珠,它在读多写少的并发场景中表现卓越。通过写时复制机制,它实现了读操作的无锁并发,特别适合配置管理、事件监听、会话管理等场景。

但是,选择数据结构时一定要根据实际应用场景权衡利弊。如果你的应用写操作频繁数据量巨大,那么ConcurrentHashMap.KeySetView可能是更好的选择。

技术选型的艺术不在于选择最先进的技术,而在于选择最合适的技术。CopyOnWriteArraySet的存在再次证明了这一原则:在正确的场景下,即使看似"低效"的复制整个数组的策略,也能成为解决高并发问题的利器。

参考文章

  1. [Java CopyOnWriteArraySet源码深度解析 - CSDN]
  2. [深度剖析 Java CopyOnWriteArraySet:源码级使用原理揭秘 - 51CTO]
  3. [揭秘 Java CopyOnWriteArraySet:深入源码剖析使用原理 - CSDN]
  4. [CopyOnWriteArraySet - CSDN]
  5. [JUC集合类 CopyOnWriteArraySet源码解析 JDK8 - CSDN]
  6. [基于CopyOnWriteArraySet的高并发在线用户状态收集器架构设计 - CSDN]
  7. [如何在Java中使用CopyOnWriteArraySet - PHP中文网]
  • 本文主要观点基于以上参考资料,结合实际开发经验整理而成。转载请注明出处。*

更多技术干货欢迎关注微信公众号科威舟的AI笔记~

【转载须知】:转载请注明原文出处及作者信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1098146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医疗动态风险评估用GNN稳住预警

&#x1f4dd; 博客主页&#xff1a;jaxzheng的CSDN主页 医疗数据科学&#xff1a;从数据洪流到精准决策的桥梁目录医疗数据科学&#xff1a;从数据洪流到精准决策的桥梁 引言&#xff1a;数据驱动的医疗革命 核心概念&#xff1a;医疗数据科学的三维支柱 面临的挑战&#xff1…

Java计算机毕设之基于SpringBoot社区住户信息管理系统住户信息管理、楼栋信息管理、房屋租售管理、缴费信息管理、报修信息管理(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

浙江口碑好的港澳台联考教育机构哪家专业

浙江口碑好的港澳台联考教育机构哪家专业在浙江&#xff0c;对于众多有志于参加港澳台联考的学生而言&#xff0c;选择一家专业且口碑良好的教育机构至关重要。这不仅关系到学生的学习效果&#xff0c;更影响着他们未来的升学之路。专业教育机构的重要性港澳台联考有着独特的考…

【计算机毕业设计案例】基于SpringBoot的发动机零件、电器元件汽车配件仓储管理系统设计与实现(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

机械制图 - Ac1d

投影 \(V\) 面:正投影面 \(H\) 面:水平投影面 \(W\) 面:侧投影面 \(Y\) 轴用 \(Y_H\) 和 \(Y_W\) 表示 长对正、高平齐、宽相等 水平线:平行于 \(H\) 面 正平线:平行于 \(V\) 面 侧平线:平行于 \(W\) 面 铅锤线:…

学生党论文降AI率,前五工具够用了

又到毕业季&#xff0c;毕业论文除了查重外&#xff0c;真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低&#xff01;实测全网产品&#xff0c;无广&#xff01;&#xff01; 如果这篇整理能帮你少走点弯路&#xff0c;那就值了。 1、嘎嘎降AI 官网&…

论文降AI别瞎改,这五佳工具效率高

又到毕业季&#xff0c;毕业论文除了查重外&#xff0c;真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低&#xff01;实测全网产品&#xff0c;无广&#xff01;&#xff01; 如果这篇整理能帮你少走点弯路&#xff0c;那就值了。 1、嘎嘎降AI 官网&…

Linux中级の自动化运维工具Ansible变量

自动化运维工具-Ansible变量 变量概述 变量提供了便捷的方式来管理Ansible playbook的每一个项目中的 动态值,比如 nginx-1.6.3 这个软件包的版本,在其他地方或许会 反复使用,那么如果将此值设置为变量,然后在其他…

2025 MBA必备!9大AI论文平台深度测评与推荐

2025 MBA必备&#xff01;9大AI论文平台深度测评与推荐 2025年MBA论文写作工具测评&#xff1a;选对平台&#xff0c;效率翻倍 随着人工智能技术的不断进步&#xff0c;AI论文平台在学术领域的应用愈发广泛。对于MBA学生而言&#xff0c;撰写高质量论文不仅是学业要求&#xff…

查重没问题却卡AI?前五降AI工具更稳

又到毕业季&#xff0c;毕业论文除了查重外&#xff0c;真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低&#xff01;实测全网产品&#xff0c;无广&#xff01;&#xff01; 如果这篇整理能帮你少走点弯路&#xff0c;那就值了。 1、嘎嘎降AI 官网&…

儿童近视度数增长过快?眼调节训练灯破解“度数逐年递增”困扰!

在儿童青少年近视防控领域&#xff0c;“每天户外活动2小时”“减少连续近距离用眼时间”等建议虽具备理论科学性&#xff0c;但在学业压力日益加重的背景下&#xff0c;实际落地难度极大。从日常作息来看&#xff0c;儿童每日需完成作业、参与各类辅导课程&#xff0c;日均户外…

CH592F开发入门2

CH592F开发入门2沁恒微 CH592F 开发板入门 2:MRS2 编译器常规使用注意:本文基于 MRS2 开发环境编写,其操作界面与旧版 MRS 存在差异,请留意区分。一、工程基础操作 1. 打开工程 (双击工程目录下的 WVPROJ 格式文件…

【课程设计/毕业设计】基于SpringBoot的汽车配件仓储管理配件档案 - 出入库管理 - 库存监控系统设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

五佳降AI工具合集,速降到合格线内

又到毕业季&#xff0c;毕业论文除了查重外&#xff0c;真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低&#xff01;实测全网产品&#xff0c;无广&#xff01;&#xff01; 如果这篇整理能帮你少走点弯路&#xff0c;那就值了。 1、嘎嘎降AI 官网&…

VS Code调试Node.js核心 打断点 → F5 → 单步执行 + 看变量 - jerry

下面我用最常见、最实用的方式,带你一步步在 VS Code 调试 Node.js 代码(适合前端 / Node 开发日常用)。一、最简单方式(推荐新手):直接调试当前 JS 文件 1️⃣ 准备一个 Node 文件 // index.js function add(a,…

如何根据年龄选择适合的近视防控方法?科学分龄,精准防控!

近视防控的核心逻辑在于“适配性”——不同年龄段人群的眼部生理结构、用眼场景存在显著差异&#xff0c;防控方案需精准匹配其特点&#xff0c;才能实现高效干预。忽视年龄差异的通用防控手段&#xff0c;往往难以达到理想效果。接下来&#xff0c;我们将按年龄段拆解核心防控…

详细解析 SYN泛洪

SYN 泛洪及相关知识解析当面试官问这个问题的时候&#xff0c;不要被 “SYN 泛洪” 这个名词给震慑到&#xff0c;其实面试官就是想知道计算机网络中关于 DDoS 攻击和 TCP 建立连接三次握手的相关知识的考核。不要担心&#xff0c;接下来将详细介绍一下 SYN 泛洪及其相关知识。…

项目风险预警:智能分析系统

项目风险预警:智能分析系统 关键词:项目风险预警、智能分析系统、风险评估、机器学习、数据分析 摘要:本文围绕项目风险预警智能分析系统展开,旨在为项目管理提供全面、高效且精准的风险预警解决方案。首先介绍了系统开发的背景、目的、预期读者和文档结构等内容,阐述了相…

Java毕设项目:基于SpringBoot的汽车配件仓储管理系统设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

性价比高的循环水处理口碑好的公司

性价比高的循环水处理&#xff1a;口碑好的公司之选在工业生产和日常生活中&#xff0c;循环水处理至关重要&#xff0c;它不仅关系到设备的正常运行和使用寿命&#xff0c;还与环境保护和资源节约息息相关。选择一家性价比高且口碑好的循环水处理公司&#xff0c;是众多企业和…