并发容器 CopyOnWriteArrayList 基于JDK 1.8

CopyOnWriteArrayList简介

 

CopyOnWriteArrayList是ArrayList的线程安全版本实现,他的名字告诉了我们,说明是在写的时候复制;

其中所有变更元素操作,add 、set 、remove等,都需要新建一个数组,来存放新元素,这通常成本太高;

在修改数据的时候,首先加锁Reentrantlock,然后复制得到一个新数组,在这个新数组上做修改,最后再将原来的数组引用指向这个新的数组,最后释放锁;而读操作则不需要加锁,这是一种读写分离的思想,读和写不同的容器,读的是旧容器,写的是新容器,所以读的数据并不一定是最新的;

使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突;

 

适合应用的场景:List大小通常比较很小(不然重新申请大空间,或者拷贝大数组,性能都比较差),读操作远多于更改操作;

 

来简单看一下add,添加元素方法的源码:

public boolean add(E e) {
    final ReentrantLock lock = this.lock;
    //操作之前,先加锁
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        //新数组容量+1,说明是可变大小
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        newElements[len] = e;
        //旧的数组地址重新指向新数组
        setArray(newElements);
        return true;
    } finally {
        lock.unlock();
    }
}

set 、remove 等操作类似,不再详细介绍。相对简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值