并发编程(16)CopyOnWriteArrayList

CopyOnWriteArrayList

CopyOnWriteArrayList:写时复制机制的ArrayList,当我们往容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行 Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。

优点:读和写不互斥的,写和写互斥,适用读多写少的场景。

缺点:内存损耗大。

public CopyOnWriteArrayList() {
    setArray(new Object[0]);
}
private transient volatile Object[] array;
final transient ReentrantLock lock = new ReentrantLock();

每一个CopyOnWriteArrayList底层都对应一个数据结构,Object[]数组,同时还对应了一个ReentrantLock独占锁,就是用独占锁来保证说要修改Object[]数组的时候,必须加独占锁,此时只能有一个线程获取锁。

add()方法

public boolean add(E e) {
    //使用Lock,保证只有一个线程执行容器复制操作
    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();
    }
}

猜你喜欢

转载自blog.csdn.net/qq40988670/article/details/86620041
今日推荐