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

CopyOnWriteArrayList 是 Java 并发包(java.util.concurrent)中一个线程安全的动态数组实现,它的核心特点是:**写操作(add、set、remove 等)会复制整个底层数组,读操作则直接在原数组上进行,不加锁。**
为什么叫 “Copy-On-Write”?
这个名字直译是“写时复制”。它的工作机制很简单:
- 每次执行修改操作(比如
add()、remove()、set())时,不是直接修改原数组,而是先创建一个新数组,把原数组内容复制过去,再在新数组上做修改,最后用新数组原子性地替换掉旧数组。 - 所有读操作(如
get()、iterator()、size())全程不加锁,也不复制,直接访问当前引用的数组——哪怕这个数组正在被其他线程更新。
适合什么场景?
它最适合读多写少且对实时一致性要求不高的并发场景,比如:
- 监听器列表(Observer 模式):大量线程频繁遍历注册的监听器,但新增/移除监听器的操作很少。
- 配置项缓存、白名单、状态标记集合等:读取非常频繁,变更极少。
⚠️ 注意:它不适合写频繁或对数据强一致性敏感的场景。因为写操作开销大(复制整个数组),而且读操作看到的可能是“过期快照”——例如迭代过程中另一个线程删除了元素,迭代器也不会抛 ConcurrentModificationException,也不会反映这次删除。
立即学习“Java免费学习笔记(深入)”;
自从百度屏蔽淘宝客网站、淘宝抛弃淘宝客之后,个人站长集体陷入了恐慌之中。此时,什么值得买网的异军突起引起了广大个人站长的极大关注。做一个什么值得买一样的导购网站成了众多个人站长的一致心愿! TP-COUPON 导购系统 即是让个人站长实现此心愿的绝佳选择! 欢迎个人站长选用。V1.1版 更新记录:1.修正请求时查询淘宝店铺错误的bug2.删除一些无用的代码
和 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,不会出错,也不会感知到已被删除。
基本上就这些。它不是万能的线程安全替代品,而是一个有明确适用边界的优化工具。










