java并发容器-CopyOnWriteArrayList-简单

2019-12-28  本文已影响0人  MJLDG

CopyOnWriteArrayList, CopyOnWrite 的 ArrayList,按名字理解就是 在写ArrayList时复制,
即每次会使容器发生变化,调用add set remove操作时,都是通过创建一个新的数组来实现的。

CopyOnWriteArrayList 适合读多写少的情况,但是如果频繁的写操作,会导致写入性能降低。

当list需要修改时,不是改变原有list,而是复制一份新的数据来进行操作,
操作完成后将新的的数据覆盖替换原来的数据。保证写操作不会影响读操作。

和读写锁ReentrantReadWriteLock有点类似。
读写锁: 读读共享, 读写互斥,写写互斥
但是CopyOnWriteArrayList有点不一样 : 读读共享,读写共享,只有写写才会互斥,
即提高了读操作的性能,只有写写操作之间才需要同步等待,
因为CopyOnWriteArrayList只有写操作才会加锁,读操作没有任何加锁。

代码如下
Object[] newElements = Arrays.copyOf(elements, len + 1);
复制了一个新的数组来进行操作

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

而读操作没有任何锁

    public E get(int index) {
        return get(getArray(), index);
    }

    private E get(Object[] a, int index) {
        return (E) a[index];
    }


上一篇下一篇

猜你喜欢

热点阅读