java并发容器-CopyOnWriteArrayList-简单了解

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


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 972评论 0 3
  • 锁 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多...
    黄俊彬阅读 1,561评论 1 15
  • 2018―10―16 姓名:叶彩霞 【日精进打卡第189天】2018.10.16 第367期(无锡市) 乐观三组 ...
    透明的水泡阅读 115评论 0 0
  • 号称“泰坦尼克号”式的爱情《 LA LA LAND》中文译名为《爱乐之城》于2月14日中国上映。这部被评价为情人节...
    萧洛zzy阅读 3,714评论 28 23
  • 鲁智深之所以能成佛,因为四个因素智、真、力、善,他虽然酒肉肠中过,但留下了佛心,还那些佛教徒每天都吃斋念佛,但...
    樊4阅读 284评论 0 0

友情链接更多精彩内容