CopyOnWrite容器:读写分离的并发容器设计与实现
CopyOnWrite(写时复制)容器是一种通过读写分离和延迟更新策略实现的高效并发容器,核心思想是:读操作直接访问当前容器,写操作则复制一份新容器进行修改,完成后再替换旧容器。这种设计在 “读多写少” 的场景下能显著提升并发性能,避免读写冲突。本文以 CopyOnWriteArrayList 为例,深入解析其原理、实现及适用场景。
CopyOnWrite 核心思想
读写分离
- 读操作:直接访问当前容器(无锁),无需阻塞;
- 写操作:不直接修改原容器,而是复制一份新容器进行修改,修改完成后通过原子操作替换旧容器;
- 最终一致性:写操作期间,读操作仍访问旧容器,避免 “脏读”;写操作完成后,所有新读操作会访问新容器,保证数据最终一致。
适用场景
- 读多写少:如配置缓存、白名单列表等,读取频率远高于修改频率;
- 允许数据短暂不一致:写操作完成前,读操作可能访问旧数据,适用于对实时性要求不高的场景;
- 遍历操作频繁:避免迭代时的
ConcurrentModificationException(传统同步容器在迭代中修改会抛此异常)。
CopyOnWriteArrayList 源码解析
CopyOnWriteArrayList 是 List 接口的并发实现,底层通过数组存储数据,核心源码如下:
核心成员变量
1 | public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { |
lock:写操作时加锁,确保同一时间只有一个线程复制和修改容器,避免多线程写操作导致的副本混乱;array:volatile修饰的数组,保证读操作能立即看到最新的容器替换(写操作完成后setArray的可见性)。
写操作:add (E e)
写操作(添加、修改、删除)的核心是复制旧数组→修改新数组→替换旧数组:

