CopyOnWriteArrayList介绍
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。
CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
在 集合的安全失败机制“fail-safe” 提到使用 CopyOnWriteArrayList 可以解决此问题,
在 com.mysql.jdbc.Driver 下会使用到,即: class.forName(“com.mysql.jdbc.Driver”)会执行以下代码。
1 | public class Driver extends NonRegisteringDriver implements java.sql.Driver { |
查看该类所在位置:
CopyOnWriteArrayList 位于 java.util.concurrent 包下,可知:该类为 并发而设计。
看示例:
1 | public static void main(String[] args) { |
1 | public class CopyOnWriteArrayList<E> |
1 | public boolean add(E e) { |
步骤:
1、加锁。
2、获取原数组(getArray()方法),得到新数组(newElements,原数组+1)。
3、把原数组的元素复制到新数组中去 。
4、新元素添加到新数组中。
5、array引用新数组。
6、释放锁。
其它操作【remvoe、clear、set】都和add 方法类似。每一次的操作都是以对Object[] array进行一次复制为基础的。
缺点
1、由于写操作的时候,需要拷贝数组,会消耗内存。
2、不能用于==实时读==的场景 ,只是做到了==最终一致性==。