JDK
版本:AdoptOpenJDK 11.0.10+9
1 基本概念
CopyOnWriteArrayList
是一种为 “读多写少” 的场景设计的列表型并发容器,其特点如下:
- 适用于高并发场景
- 列表型容器
- 利用 “写时复制” 思想,保证读/写同时进行不会冲突
- 只有当多个线程同时进行写操作的时候,才需要同步
“写时复制” 的思想是,当我们需要修改(增/删/改)列表中的元素时,不直接进行修改,而是先将列表复制一份,然后在新的副本上进行修改,修改完成之后,再将引用从原列表指向新列表。
2 内部原理
CopyOnWriteArrayList
内部:
- 通过一个
Object[]
数组来保存数据。 - 通过一个
Object
对象lock
来对写操作进行加锁,使用的是synchronized (lock)
方式。 CopyOnWriteArrayList
的所有读方法都不会加锁,所有增、删、改方法都会加锁。
public class CopyOnWriteArrayList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
private static final long serialVersionUID = 8673264195747942595L;
// Object对象lock,对写操作进行加锁,通过synchronized (lock)的方式进行加锁
final transient Object lock = new Object();
// 保存数据的数组
private transient volatile Object[] array;
......
}
2.1 get 获取数据
get
方法的源码如下:
public E get(