一、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 执行特点
- 读读不阻塞
- 读写不阻塞
- 写写互斥
设计思想:牺牲写操作效率,极致放大读操作效率
三、适用场景
极其适合 读多写少 的高并发业务场景:
- 系统全局配置
- 权限白名单、黑名单
- 常量字典集合
- 高频查询、极少修改的数据
❌ 不适合:频繁新增、删除、修改的场景(频繁拷贝副本,性能损耗大)
四、三大 List 集合深度对比(面试高频)
4.1 CopyOnWriteArrayList VS Vector
共同点
- 两个集合 都是线程安全
核心区别
- Vector:读写全部加锁,所有操作互斥,并发极差
- CopyOnWriteArrayList:读不加锁、仅写加锁
- 读多场景下,CopyOnWriteArrayList 性能碾压 Vector
4.2 CopyOnWriteArrayList VS ArrayList
共同点
- API 完全一致
- 使用方式、遍历方式、特性完全兼容
核心区别
- ArrayList:线程不安全、读写最快、并发会报错
- CopyOnWriteArrayList:线程安全、读性能极高、写性能偏低
- 读多写少时,性能无限接近 ArrayList
五、使用特点
CopyOnWriteArrayList完全兼容 ArrayList 语法- 所有遍历、增删改查代码无需改动
- 企业开发中:优先替代 Vector
六、拓展知识点(面试加分)
6.1 弱一致性
读取操作永远读取的是 旧数组快照 写操作在新副本执行,因此读不到实时最新数据 适合允许短暂数据延迟的业务
6.2 迭代器不抛并发修改异常
普通 ArrayList 遍历时修改集合 → 抛出 ConcurrentModificationException CopyOnWriteArrayList 不会报错,因为迭代的是旧数组快照
七、本章极简背诵总结
CopyOnWriteArrayList位于java.util.concurrent- 机制:读不加锁、写时复制、副本替换
- 优势:读多写少超高并发性能
- 和 Vector:都安全,前者性能吊打后者
- 和 ArrayList:用法一致,前者安全、后者不安全
- 适合:读多写少 并发场景