1,CopyOnWriteArrayList 插入, add() 方法
public synchronized boolean add(E e) {
Object[] newElements = new Object[elements.length + 1];
System.arraycopy(elements, 0, newElements, 0, elements.length);
newElements[elements.length] = e;
elements = newElements;
return true;
}
synchronized 同步,不能线程同时 add, 创建一个新数组 newElements,
System.arraycopy() 拷贝, 新元素 插入新数组 newElements,
element,指向新数组。
2,在读取 element 时,add() 行为会在新数组进行,不冲突。
add() 添加完成,elements,指向新数组,读操作,遍历时在 old snapshot elements。
3,清理,clear()
@Override
public synchronized void clear() {
elements = EmptyArray.OBJECT;
}
同步,element 数组指针指向其他, EmptyArray.OBJECT。
不影响 iterator() 遍历的原数组元素。
public Iterator<E> iterator() {
Object[] snapshot = elements;
return new CowIterator<E>(snapshot, 0, snapshot.length);
}
CowIterator 内部元素
CowIterator(Object[] snapshot, int from, int to) {
this.snapshot = snapshot;
this.from = from;
this.to = to;
this.index = from;
}
遍历 snapshot 数组。
任重而道远