CopyOnWriteArrayList
CopyOnWriteArrayList:写时复制机制的ArrayList,当我们往容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行 Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。
优点:读和写不互斥的,写和写互斥,适用读多写少的场景。
缺点:内存损耗大。
public CopyOnWriteArrayList() {
setArray(new Object[0]);
}
private transient volatile Object[] array;
final transient ReentrantLock lock = new ReentrantLock();
每一个CopyOnWriteArrayList底层都对应一个数据结构,Object[]数组,同时还对应了一个ReentrantLock独占锁,就是用独占锁来保证说要修改Object[]数组的时候,必须加独占锁,此时只能有一个线程获取锁。
add()方法
public boolean add(E e) {
//使用Lock,保证只有一个线程执行容器复制操作
final ReentrantLock lock = this.lock;
lock.lock();
try {
//获取旧数组引用
Object[] elements = getArray();
int len = elements.length;
//创建新的数组,并将旧数组的数据复制到新数组中
Object[] newElements = Arrays.copyOf(elements, len + 1);
//往新数组中添加新的数据
newElements[len] = e;
//将旧数组引用指向新的数组
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}