底层
- 首先 CopyOnWriteArrayList内部也是通过数组来实现的,在向 CopyOnWriteArrayList 添加元素时,会复制一个新的数组,写操作在新数组上进行,读操作在原数组上进行
- 并且,写操作会加锁,防止出现并发写入丢数据的问题
- 写操作结束之后会把原数组指向新数组
- CopyOnWriteArrayList允许在写操作时来读取数据,大大提高了读的性能,因此适合读多写少的应用场景,但是CopyOnWriteArrayList会比较占内存,同时可能读到的数据并不是实时更新的最新数据,所以不适合实时性要求很高的场景
源码
public boolean add(E e) {
//加锁
final ReentrantLock lock = this.lock;
lock.lock();
try {
//获取原数组
Object[] elements = getArray();
//原数组长度
int len = elements.length;
//复制一个新数组,长度是原长度+1
Object[] newElements = Arrays.copyOf(elements, len + 1);
// 将数据放到新数组中
newElements[len] = e;
//将新数组赋值给自己
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
final void setArray(Object[] a) {
array = a;
}