十六(3)、《集合扩充》CopyOnWriteArrayList 超详细解析(线程安全集合)

一、CopyOnWriteArrayList 概述

CopyOnWriteArrayList 是 JDK1.5 新增的高并发线程安全 List 集合。 专门解决传统集合痛点:

  • ArrayList:线程不安全、效率高
  • Vector:线程安全、效率极低

1.1 所属包

复制代码
java.util.concurrent

属于 并发工具包,专为多线程并发场景设计。


二、底层核心原理(⭐核心考点)

2.1 写时复制机制(Copy-On-Write)

CopyOnWriteArrayList 采用 读写分离机制:

✅ 读操作(get /size/ 遍历)

  • 不加锁
  • 允许多线程 同时并发读取
  • 读取速度极快,几乎和 ArrayList 一致

✅ 写操作(add /set/remove /clear)

  • 加锁保证原子性
  • 不会直接修改原数组
  • 底层 拷贝一份原集合副本
  • 在副本上完成写操作
  • 写完后 新数组直接替换旧数组

2.2 执行特点

  1. 读读不阻塞
  2. 读写不阻塞
  3. 写写互斥

设计思想:牺牲写操作效率,极致放大读操作效率


三、适用场景

极其适合 读多写少 的高并发业务场景:

  • 系统全局配置
  • 权限白名单、黑名单
  • 常量字典集合
  • 高频查询、极少修改的数据

❌ 不适合:频繁新增、删除、修改的场景(频繁拷贝副本,性能损耗大)


四、三大 List 集合深度对比(面试高频)

4.1 CopyOnWriteArrayList VS Vector

共同点
  • 两个集合 都是线程安全
核心区别
  • Vector:读写全部加锁,所有操作互斥,并发极差
  • CopyOnWriteArrayList:读不加锁、仅写加锁
  • 读多场景下,CopyOnWriteArrayList 性能碾压 Vector

4.2 CopyOnWriteArrayList VS ArrayList

共同点
  • API 完全一致
  • 使用方式、遍历方式、特性完全兼容
核心区别
  • ArrayList:线程不安全、读写最快、并发会报错
  • CopyOnWriteArrayList:线程安全、读性能极高、写性能偏低
  • 读多写少时,性能无限接近 ArrayList

五、使用特点

  1. CopyOnWriteArrayList 完全兼容 ArrayList 语法
  2. 所有遍历、增删改查代码无需改动
  3. 企业开发中:优先替代 Vector

六、拓展知识点(面试加分)

6.1 弱一致性

读取操作永远读取的是 旧数组快照 写操作在新副本执行,因此读不到实时最新数据 适合允许短暂数据延迟的业务

6.2 迭代器不抛并发修改异常

普通 ArrayList 遍历时修改集合 → 抛出 ConcurrentModificationException CopyOnWriteArrayList 不会报错,因为迭代的是旧数组快照


七、本章极简背诵总结

  1. CopyOnWriteArrayList 位于 java.util.concurrent
  2. 机制:读不加锁、写时复制、副本替换
  3. 优势:读多写少超高并发性能
  4. 和 Vector:都安全,前者性能吊打后者
  5. 和 ArrayList:用法一致,前者安全、后者不安全
  6. 适合:读多写少 并发场景
相关推荐
斯维赤3 小时前
微信步数的10点定时推送,看似简单,实则暗藏玄机
java·后端
David猪大卫3 小时前
【C++修炼】STL容器—stack与queue
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
Linux_cy3 小时前
服务器管理方案选型:面板 / SSH 客户端 / 桌面型客户端怎么选
java·linux·运维·服务器·ssh·可视化·gmssh
凯凯姜3 小时前
Ollama 本地部署大语言模型笔记
人工智能·笔记·语言模型
ACP广源盛139246256733 小时前
选型评估笔记:面向轻量化边缘 IO 扩展的 PCIe4.0 交换方案 IX8012@ACP
笔记·硬件架构·pcie·hdmi·国产芯片
mONESY3 小时前
从线性 RAG 到 Agentic RAG|基于 LangGraph 实现自主决策 RAG 闭环
javascript·面试
克里斯蒂亚诺更新3 小时前
ruoyi项目验证码 登录接口的调用
笔记
可乐_不渴3 小时前
【Linux】 进程虚拟地址空间
java·linux·javascript
SimonKing3 小时前
号外号外,Stream-Nexus推送项目支持集群部署了
java·后端·程序员
Nuanyt4 小时前
Agent 学习笔记(下篇二):Claude Code 生态、RAG 与 Memory(Stage 5–6)
笔记·python·memory·rag·aiagent·claude code·agentskill