十六(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. 适合:读多写少 并发场景
相关推荐
怕浪猫7 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
陈卫军老师7 小时前
陈卫军语录全集总结:12句话,一条主线
经验分享·笔记
daidaidaiyu8 小时前
ThingsBoard 集群的核心逻辑源码分析
java
我可能是个假开发9 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong9 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
【JAVA】玩家10 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring
Wang's Blog10 小时前
Java框架 SpringCloud 快速入门: 实现 Feign 最佳实践(抽取方式)
java·spring cloud
2501_9269783311 小时前
给自指系统接一个外部锚 —— 一个关于「用 AI 观察自己」的方法
人工智能·经验分享·笔记·机器学习·ai写作
MandalaO_O11 小时前
IDEA 开发(快捷键 + 调试 + 序列化)
java·ide·intellij-idea
xiaoqiMikko12 小时前
JVM 线上排查实战(七):jps 看不见它、jstack 连不上它,可它明明活得好好的
java·jvm