小米Java开发200道面试题及参考答案(上)
CopyOnWriteList 如何保证线程安全?其设计思路是什么?
CopyOnWriteList 是 Java 并发包(java.util.concurrent)提供的线程安全 List 实现,核心设计思路是“读写分离 + 写时复制”,通过牺牲写操作性能换取读操作的高效和线程安全,适用于“读多写少”的并发场景。
一、核心设计思路:写时复制(Copy-On-Write)
“写时复制”是 CopyOnWriteList 的核心思想,本质是:所有读操作直接访问原始数据,所有写操作(添加、删除、修改)都会创建原始数组的副本,在副本上执行写操作,操作完成后将数组引用指向新副本。
- 核心目标:读操作无需加锁(直接访问原始数组),写操作通过副本隔离并发冲突,避免读写互斥,保证读操作的高效性和线程安全性。
- 关键前提:数组是不可变的(写操作不修改原始数组,仅修改副本),因此读操作无需担心数据被并发修改,无需同步控制。
二、保证线程安全的底层实现
CopyOnWriteList 通过“锁机制 + 数组副本”双重保障线程安全,底层核心结构是 volatile 修饰的数组(private transient volatile Object[] array),配合重入锁(ReentrantLock)控制写操作的并发,具体实现细节如下:
1. 读操作:无锁直接访问,高效安全
CopyOnWriteList 的读操作(ge
