码迷,mamicode.com
首页 > 其他好文 > 详细

CopyOnWriteArrayList介绍

时间:2019-01-03 12:03:16      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:public   write   缺点   driver   pre   rem   and   ESS   复制   

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

? CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

在 com.mysql.jdbc.Driver 下会使用到,即: class.forName("com.mysql.jdbc.Driver")会执行以下代码。

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    static {
         DriverManager.registerDriver(new Driver());
    }
}

public class DriverManager {
    // List of registered JDBC drivers
    private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
}

查看该类所在位置:

? CopyOnWriteArrayList 位于 java.util.concurrent 包下,可知:该类为 并发而设计。

看示例:

public static void main(String[] args) {
        List<Integer> list = new CopyOnWriteArrayList<>();
        list.add(1);
        list.add(2);
}
public class CopyOnWriteArrayList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    
    final transient ReentrantLock lock = new ReentrantLock();

    /** The array, accessed only via getArray/setArray. */
     // 使用 Object 数组 存储数据。
    private transient volatile Object[] array;
 }
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();// 释放锁
    }
}

步骤:

1、加锁。

2、获取原数组(getArray()方法),得到新数组(newElements,原数组+1)。

3、把原数组的元素复制到新数组中去 。

4、新元素添加到新数组中。

5、array引用新数组。

6、释放锁。

其它操作【remvoe、clear、set】都和add 方法类似。每一次的操作都是以对Object[] array进行一次复制为基础的。

缺点

1、由于写操作的时候,需要拷贝数组,会消耗内存。

2、不能用于==实时读==的场景 ,只是做到了最终一致性。

CopyOnWriteArrayList介绍

标签:public   write   缺点   driver   pre   rem   and   ESS   复制   

原文地址:https://www.cnblogs.com/wansw/p/10213220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!