0
点赞
收藏
分享

微信扫一扫

Java集合源码之CopyOnWrite-CopyOnWriteArrayList


什么是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不一致,这就是读的方法的延时原因。



 



 



 



 



 



 



 



 

举报

相关推荐

0 条评论