CopyOnWriteArrayList是并发安全的List,其底层数据的存储仍然是靠Object[],重点在于它如何实现并发安全的,还是比较简单的
1.初始化
我们可以看到其实就是创建了一个长度为0的数组
2.add元素
每次添加元素都会加锁,同时调用Arrays.copyOf方法将原数组的内容拷贝到新数组中,新数组的长度是 原数组长度+1,然后把array指向这个新数组
3.修改制定元素
也是每次修改前加锁,需要注意的是并不是直接修改原数组的元素,而是clone出一个新数组,修改新数组的元素
4.删除元素
思路基本相同,加速,创建新数组,将原数组元素拷贝过去
5.迭代的弱一致性
迭代的弱一致性指的是,由于CopyOnWriteArrayList每次修改使通过复制原数组到新数组的方式实现的,所以在一个线程获取迭代器Iterator后,其他线程对CopyOnWriteArrayList的修改对Iterator是不可见的
由于CopyOnWriteArrayList每次修改元素的开销还是挺大的,所以CopyOnWrite并发容器也常被用于读多写少的并发场景。