美文网首页
java并发容器-CopyOnWriteArrayList-简单

java并发容器-CopyOnWriteArrayList-简单

作者: MJLDG | 来源:发表于2019-12-28 11:40 被阅读0次

    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];
        }
    
    
    

    相关文章

      网友评论

          本文标题:java并发容器-CopyOnWriteArrayList-简单

          本文链接:https://www.haomeiwen.com/subject/sqljoctx.html