Java面试题06-CopyOnWriteArrayList的底层原理
1、首先的话CopyOnWriteArrayList的底层也是通过数组来实现的,在向CopyOnWriteArrayList添加元素时,会复制一个新的数组并且将CopyOnWriteArrayList的数据存储数组指向它,写操作在新的数组上进行,读操作在原数组上进行。
//CopyOnWriteArrayList的底层数组
private transient volatile Object[] array;
2、写操作会加锁,防止出现并发写入丢失数据的问题。并且,写操作在结束之后会把元素组指向新的数组。
// 添加元素的操作
public boolean add(E var1) {
// 加锁操作
ReentrantLock var2 = this.lock;
var2.lock();
boolean var6;
try {
Object[] var3 = this.getArray();
int var4 = var3.length;
//复制原来的数组到新数组,新数组长度是原数组长度 + 1
Object[] var5 = Arrays.copyOf(var3, var4 + 1);
//将元素赋值给数组最后一个元素
var5[var4] = var1;
//指向CopyOnWriteArrayList的底层数组
this.setArray(var5);
var6 = true;
} finally {
//解锁
var2.unlock();
}
return var6;
}
// 获取元素
public E get(int index) {
// 直接返回数据数组中该下标的元素
return this.get(this.getArray(), index);
}
3、CopyOnWriteArrayList允许在写操作时来读取数据,大大提高了读的性能,因此适合读多写少的应用场景,但是CopyOnWriteArrayList会比较占用内存,同时读取到的数据不是实时最新的数据,所以不适合实时性要求很高的场景。