Java集合源码之CopyOnWrite-CopyOnWriteArrayList

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28666081/article/details/85058545
什么是CopyOnWrite?
概括为"写时复制",通俗的讲是写数据的时候弄出一个新的数组,然后讲旧的数据拷贝过去,更新后再将引用指向新数组。这样在添加删除元素时就不会影响旧数组的读取了,确保高并发时读的效率,但是存在延时。
 

下面以CopyOnWriteArrayList作为例子
1 写的方法add() - 其他修改的方法类似:
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();
    }
}
解析:当前add获取了旧的数组数据,然后将旧数组的值拷贝一份到新数组,新数组修改后重新设置值的引用。整个过程是加锁的所以是线程安全,但也是同步阻塞的。
 
2 读的方法size() - 其他修改的方法类似
public int size() {
    return getArray().length;
}
解析:size()方法是直接从array数组里面取长度,没有进行阻塞,这样当有线程在执行add()操作时还没更新完,就会导致旧的数组与新的数组size不一致,这就是读的方法的延时原因
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/qq_28666081/article/details/85058545