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 同步发框,不能線程同時(shí) add泣懊, 創(chuàng)建一個(gè)新數(shù)組 newElements伸辟,
System.arraycopy() 拷貝, 新元素 插入新數(shù)組 newElements馍刮,
element信夫,指向新數(shù)組。
2卡啰,在讀取 element 時(shí)静稻,add() 行為會在新數(shù)組進(jìn)行,不沖突匈辱。
add() 添加完成振湾,elements,指向新數(shù)組梅誓,讀操作恰梢,遍歷時(shí)在 old snapshot elements。
3梗掰,清理嵌言,clear()
@Override
public synchronized void clear() {
elements = EmptyArray.OBJECT;
}
同步,element 數(shù)組指針指向其他及穗, EmptyArray.OBJECT摧茴。
不影響 iterator() 遍歷的原數(shù)組元素。
public Iterator<E> iterator() {
Object[] snapshot = elements;
return new CowIterator<E>(snapshot, 0, snapshot.length);
}
CowIterator 內(nèi)部元素
CowIterator(Object[] snapshot, int from, int to) {
this.snapshot = snapshot;
this.from = from;
this.to = to;
this.index = from;
}
遍歷 snapshot 數(shù)組埂陆。
任重而道遠(yuǎn)