注意:本文内容基于JDK11,不同版本会有差异
数据结构
CopyOnWriteArrayList本质上仍是一个数组,所以的实现都是基于数组来进行的
源码解析
本文以add方法来解析CopyOnWriteArrayList,来看看它如何进行数组存储和实现高并发的。 CopyOnWriteArrayList的add实现方法要比ArrayList更加的直观易懂。
private transient volatile Object[] array;
public CopyOnWriteArrayList() {
setArray(new Object[0]);
}
public boolean add(E e){
synchronized (lock){
Object[] es = getArray();
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];
System.arraycopy(es, 0, newElements, 0, index);
System.arraycopy(es, index + 1, newElements, index,
numMoved);
}
setArray(newElements);
return oldValue;
}
}
|