CopyOnWriteArrayList源码分析

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

上一篇:Java原子性操作之——Atomic包的原理分析


下一篇:app is in background uid UidRecord错误