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

一、CopyOnWriteArrayList 概述

CopyOnWriteArrayListJDK1.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. 适合:读多写少 并发场景
相关推荐
逆境不可逃1 小时前
Pi Agent 学习笔记:对话怎样保存、分支与恢复
java
huaweichenai1 小时前
spring boot使用hutool实现调用外部接口
java·spring boot
维克兜率天1 小时前
5.3 宏观因子:抬头看天
笔记·python·深度学习·算法·量化
LuminousCPP1 小时前
数据结构-排序(五):计数排序与排序专题阶段总结|从外部归并到线性排序,再看算法边界与选型
c语言·数据结构·笔记·算法·排序算法
泡海椒1 小时前
Java 后端最优 PDF 导出方案:jquick-pdf 项目引入与快速测试
java·开发语言·pdf
XuCoder1 小时前
LangChain 模型调用:invoke、stream、batch 到底该怎么选?
面试
钓鱼的肝1 小时前
csp-j-s总结(1)
c++·笔记·算法·青少年编程
阿飞7662 小时前
订单超时自动关单:RabbitMQ 延迟队列 + 定时任务"双保险"实践
java
The Chosen One9852 小时前
OS第二章随手记(2.1)
linux·运维·服务器·笔记