注意:本文内容基于JDK11,不同版本会有差异
数据结构
CopyOnWriteArrayList本质上仍是一个数组,所以的实现都是基于数组来进行的
源码解析
本文以add方法来解析CopyOnWriteArrayList,来看看它如何进行数组存储和实现高并发的。
CopyOnWriteArrayList的add实现方法要比ArrayList更加的直观易懂。
/**
* 只能被getArray/setArray方法访问
* array为CopyOnWriteArrayList存储数据的具体数组
*/
private transient volatile Object[] array;
/**
* CopyOnWriteArrayList会在初始化时,在默认的构造函数里创建一个长度为0的数组
*/
public CopyOnWriteArrayList() {
setArray(new Object[0]);
}
/**
* add实现高并发的原理即使用了synchronized同步关键字
* @param e
* @return
*/
public boolean add(E e){
synchronized (lock){
Object[] es = getArray();
//第一次默认的初始化长度为0
int len = es.length;
es = Arrays.copyOf(es, len + 1);
es[len] = e;
setArray(es);
return true;
}
}
public E remove(int index){
synchronized (lock){
Object[] es = getArray();
int len = es.length;
E oldValue = elementAt(es, index);
//用于判断 需要移动的数量
int numMoved = len - index - 1;
Object[] newElements;
if(numMoved == 0){
newElements = Arrays.copyOf(es, len-1);
}else {
newElements = new Object[len - 1];
//复制index之前的数据
System.arraycopy(es, 0, newElements, 0, index);
//复制index之后的数据
System.arraycopy(es, index + 1, newElements, index,
numMoved);
}
setArray(newElements);
return oldValue;
}
}