Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始所有线程都在共享同一个内容,当某个线程想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器可以在非常多的并发场景中使用到。

CopyOnWrite

CopyOnWrite容器即写时复制的容器。通俗的理解是往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器,例如CopyOnWriteArray,CopyOnWriteArraySet。

CopyOnWriteArrayList的实现原理

/** The array, accessed only via getArray/setArray. */
    private transient volatile Object[] array;

内部数组用volatile保证修改的可见性,读的时候不需要加锁,如果读的时候有多个线程正在向CopyOnWriteArrayList添加数据,读还是会读到旧的数据,因为写的时候不会锁住旧的CopyOnWriteArrayList。

public boolean add(E e) {
        synchronized (lock) {
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            newElements[len] = e;
            setArray(newElements);
            return true;
        }
    }

添加的时候加锁同步


老污的猫
30 声望5 粉丝

« 上一篇
Zookeeper & Eureka
下一篇 »
ThreadLocal