登录
首页 >  文章 >  java教程

Java并发集合:CopyOnWriteArrayList解析

时间:2025-12-19 15:00:40 413浏览 收藏

推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Java并发集合:CopyOnWriteArrayList详解》,聊聊,我们一起来看看吧!

CopyOnWriteArrayList是读多写少场景下的线程安全集合,写操作复制整个数组,读操作无锁直接访问;2. 适合监听器列表、配置缓存等低频修改场景,不适用高频写或强一致需求;3. 相比ArrayList非线程安全,Vector和synchronizedList读写全加锁低吞吐,它读高效但可能读到旧数据快照。

java中CopyOnWriteArrayList是什么

CopyOnWriteArrayList 是 Java 并发包(java.util.concurrent)中一个线程安全的动态数组实现,它的核心特点是:**写操作(add、set、remove 等)会复制整个底层数组,读操作则直接在原数组上进行,不加锁。**

为什么叫 “Copy-On-Write”?

这个名字直译是“写时复制”。它的工作机制很简单:

  • 每次执行修改操作(比如 add()remove()set())时,不是直接修改原数组,而是先创建一个新数组,把原数组内容复制过去,再在新数组上做修改,最后用新数组原子性地替换掉旧数组。
  • 所有读操作(如 get()iterator()size())全程不加锁,也不复制,直接访问当前引用的数组——哪怕这个数组正在被其他线程更新。

适合什么场景?

它最适合读多写少且对实时一致性要求不高的并发场景,比如:

  • 监听器列表(Observer 模式):大量线程频繁遍历注册的监听器,但新增/移除监听器的操作很少。
  • 配置项缓存、白名单、状态标记集合等:读取非常频繁,变更极少。

⚠️ 注意:它不适合写频繁或对数据强一致性敏感的场景。因为写操作开销大(复制整个数组),而且读操作看到的可能是“过期快照”——例如迭代过程中另一个线程删除了元素,迭代器也不会抛 ConcurrentModificationException,也不会反映这次删除。

和 ArrayList / Vector / Collections.synchronizedList 的区别

• ArrayList:非线程安全,读写都不加锁,多线程下可能出错。
• Vector / synchronizedList:读写都加同一把锁,串行化,吞吐量低,但能保证强一致性。
• CopyOnWriteArrayList:读完全无锁、高性能;写需复制+加锁(只锁写过程),但读到的数据可能滞后。

一个小例子帮你理解“读到旧数据”

假设 list 初始为 [A, B],线程 T1 正在遍历:

for (String s : list) { ... } // 此时拿到的是 [A, B] 的快照

与此同时,线程 T2 执行 list.remove("B") —— 它会复制出新数组 [A] 并替换。但 T1 的 for-each 仍在原数组 [A, B] 上运行,所以仍会遍历到 B,不会出错,也不会感知到已被删除。

基本上就这些。它不是万能的线程安全替代品,而是一个有明确适用边界的优化工具。

理论要掌握,实操不能落!以上关于《Java并发集合:CopyOnWriteArrayList解析》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>