CopyOnWtiteArrayList的读操作性能优越,但是基于CopyOnWtiteArrayList的写操作性能却不尽人意。以下是CopyOnWriteArrayList的add()方法实现。
public E set(int index, E element) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
E oldValue = get(elements, index);
if (oldValue != element) {
int len = elements.length;
//做了一次数组复制
Object[] newElements = Arrays.copyOf(elements, len);
//修改副本
newElements[index] = element;
//写回副本
setArray(newElements);
} else {
// Not quite a no-op; ensures volatile write semantics
setArray(elements);
}
return oldValue;
} finally {
lock.unlock();
}
}
写操作,比如向容器中天剑一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的引用指向新容器。
缺点:内存占用高,每次读操作都要将元容器拷贝一份,数量大时,对内存压力较大,可能会引起频繁GC
注意:在读多写少的高并发环境中,使用copyOnWriteArrayList可以提高系统的性能。但是在写多读少的场合,CopyOnWriteArrayList的性能可能不如Vector