欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CopyOnWriteArrayList源码分析

程序员文章站 2022-07-14 16:14:23
...

CopyOnWtiteArrayList的读操作性能优越,但是基于CopyOnWtiteArrayList的写操作性能却不尽人意。以下是CopyOnWriteArrayList的add()方法实现。

   public E set(int index, E element) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            E oldValue = get(elements, index);

            if (oldValue != element) {
                int len = elements.length;
                //做了一次数组复制
                Object[] newElements = Arrays.copyOf(elements, len);
                //修改副本
                newElements[index] = element;
                //写回副本
                setArray(newElements);
            } else {
                // Not quite a no-op; ensures volatile write semantics
                setArray(elements);
            }
            return oldValue;
        } finally {
            lock.unlock();
        }
    }

写操作,比如向容器中天剑一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的引用指向新容器。

缺点:内存占用高,每次读操作都要将元容器拷贝一份,数量大时,对内存压力较大,可能会引起频繁GC

注意:在读多写少的高并发环境中,使用copyOnWriteArrayList可以提高系统的性能。但是在写多读少的场合,CopyOnWriteArrayList的性能可能不如Vector