CopyOnWriteArrayList 并发


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 iterator() {
    Object[] snapshot = elements;
    return new CowIterator(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 数组。


任重而道远

你可能感兴趣的:(CopyOnWriteArrayList 并发)