当前位置: 首页 > news >正文

Java线程安全利器:CopyOnWriteArrayList详解

一、一句话理解

CopyOnWriteArrayList是一个线程安全的 List,它通过“写时复制”(Copy-On-Write)策略实现并发控制:所有修改操作(add/set/remove 等)都会创建底层数组的一个全新副本,而读操作(get/iterator/size 等)直接访问当前快照,无需加锁。


二、核心设计思想

1.写时复制(Copy-On-Write)

  • 读操作无锁:因为底层数组是volatile的,读操作看到的是某个“瞬间快照”,天然线程安全。
  • 写操作加锁 + 复制
    • 使用ReentrantLock保证同一时间只有一个写操作。
    • 修改时,不改动原数组,而是:
      1. 拷贝一份新数组(Arrays.copyOf
      2. 在新数组上做修改
      3. array引用原子地指向新数组(volatile写)
publicbooleanadd(Ee){finalReentrantLocklock=this.lock;lock.lock();try{Object[]elements=getArray();// 旧数组Object[]newElements=Arrays.copyOf(elements,len+1);// 复制newElements[len]=e;// 修改副本setArray(newElements);// volatile 写,切换引用returntrue;}finally{lock.unlock();}}

2.弱一致性迭代器(Snapshot Iterator)

  • 调用iterator()时,会捕获当前array的引用(快照)。
  • 迭代过程中:
    • 不会抛出ConcurrentModificationException
    • 看不到之后的修改(因为用的是旧数组)
    • 不支持remove()/set()/add()→ 抛UnsupportedOperationException
publicIterator<E>iterator(){returnnewCOWIterator<E>(getArray(),0);// 传入当前 array 快照}

3.适用场景

读多写少(如监听器列表、配置项缓存)
遍历时不能加锁(避免死锁或性能瓶颈)
写操作频繁→ 每次复制数组开销大(O(n) 时间 + 内存)
实时性要求高→ 迭代器看不到最新修改


三、关键特性总结

特性说明
线程安全所有可变操作加锁,读操作无锁但可见性由volatile保证
内存一致性happens-before:写入前的操作对后续读取该元素的线程可见
允许 null 元素null被当作普通元素处理
fail-safe 迭代器基于快照,不抛ConcurrentModificationException
高写成本每次写都复制整个数组,适合小规模、低频修改
最终一致性读操作可能看到“过期”数据,但不会出错

四、与Vector/Collections.synchronizedList对比

CopyOnWriteArrayListVector/synchronizedList
读性能⭐⭐⭐ 极高(无锁)⭐ 需要获取锁
写性能⭐ 极低(复制整个数组)⭐⭐ 中等(只锁方法)
迭代行为快照,不阻塞写,不抛异常需手动同步,否则可能抛ConcurrentModificationException
内存占用高(写时双倍内存)

五、使用示例

// 典型场景:事件监听器列表publicclassEventBus{privatefinalList<Listener>listeners=newCopyOnWriteArrayList<>();publicvoidaddListener(Listenerl){listeners.add(l);// 安全}publicvoidfireEvent(Evente){// 遍历时其他线程可安全增删监听器for(Listenerl:listeners){l.onEvent(e);}}}

六、注意事项

  1. 不要用于大数据量列表:写操作 O(n) 复制,GC 压力大。
  2. 不要依赖迭代器实时性:它反映的是调用iterator()时的状态。
  3. 组合操作非原子:如if (!list.contains(x)) list.add(x)不是原子的,需外部同步。

七、源码亮点

  • volatile Object[] array:保证数组引用的可见性。
  • ReentrantLock lock:细粒度控制写操作。
  • COWIterator:实现快照语义。
  • addIfAbsent/addAllAbsent:提供“去重添加”语义,内部也基于快照判断。

总结

CopyOnWriteArrayList为高并发读、低频写场景量身定制的线程安全容器。它用空间换时间 + 最终一致性的思路,巧妙避免了读写冲突,是并发编程中“乐观锁”思想的经典体现。

如果你正在处理类似“观察者列表”、“白名单配置”等场景,它往往是比synchronizedList更优的选择。

http://www.jsqmd.com/news/123879/

相关文章:

  • 2025年质量好的半自动贴标机行业内口碑厂家排行榜 - 行业平台推荐
  • 3步掌握纪念币预约神器:告别手速不够的烦恼
  • League Akari英雄联盟辅助工具:从新手到高手的智能伙伴
  • 2025年评价高的无人机吊运竹子飞手接单/无人机打农药飞手接单实力认证推荐榜 - 行业平台推荐
  • Bili2text终极指南:3步实现B站视频文字智能提取
  • 端侧大模型部署实战(基于Open-AutoGLM的轻量化协同优化方案)
  • 麦角硫因哪个牌子最好?全球十大麦角硫因排名,用过的人极力分享,口碑扎实 - 博客万
  • 2025年抗震支架管制造企业实力推荐榜单:抗震支吊架/抗震支撑架/风机抗震支架源头厂家精选 - 品牌推荐官
  • NVIDIA显卡隐藏性能解锁指南:5个被官方忽略的调优技巧
  • 微信红包自动抢终极指南:3分钟搞定智能配置
  • Keil5安装教程:STM32开发环境手把手配置指南
  • 2025年废气治理供货厂家权威推荐榜单:环保设备/喷漆房废气处理/大气环保设备源头厂家精选 - 品牌推荐官
  • 人机协同如何重塑企业生产力?3个真实案例揭示转型关键路径
  • 如何免费实现微信多设备同时登录?WeChatPad平板模式完整教程
  • 2025年口碑好的铁盒厂家最新权威推荐排行榜 - 行业平台推荐
  • 2025年优质GEO优化软件推荐:精准布局AI搜索新生态 - 品牌推荐排行榜
  • 高速养护工区光伏物联网系统方案
  • 2025-2026北京刑事纠纷律师事务所口碑排名白皮书:权威解析靠谱机构实力 - 苏木2025
  • 不同行业软件的功能安全测试标准研究
  • 2025上海靠谱婚介公司TOP5权威推荐:甄选正规婚介品牌 - myqiye
  • 终极微信红包自动化解决方案:完整配置与实战指南
  • NVIDIA Profile Inspector仿写文章创作指南
  • 2025-2026北京刑事辩护律师事务所口碑排名白皮书:权威解析靠谱机构实力与胜诉率 - 苏木2025
  • UXTU终极指南:硬件性能实战调校与潜能释放
  • 成都火锅口碑排行榜,这8家店回头客超多,特色美食/美食/火锅/烧菜火锅/社区火锅成都火锅品牌选哪家 - 品牌推荐师
  • Virtual Serial Port Driver在WDM模型中的应用实战
  • 2025年口碑好的地磅厂家推荐,知名地磅企业全解析 - 工业推荐榜
  • 2025年Geo优化软件公司推荐与选择指南:精准赋能AI流量增长 - 品牌推荐排行榜
  • Unity游戏翻译终极指南:一键突破语言障碍的完整方案
  • Menu控件修改