一、写操作
写过程中加锁,复制新的数组,覆盖原数组。
1.新增
public boolean add(E var1) {
ReentrantLock var2 = this.lock;
var2.lock();
boolean var6;
try {
Object[] var3 = this.getArray();
int var4 = var3.length;
Object[] var5 = Arrays.copyOf(var3, var4 + 1);
var5[var4] = var1;
this.setArray(var5);
var6 = true;
} finally {
var2.unlock();
}
return var6;
}
2.删除
private boolean remove(Object var1, Object[] var2, int var3) {
ReentrantLock var4 = this.lock;
var4.lock();
try {
Object[] var5 = this.getArray();
int var6 = var5.length;
boolean var13;
if (var2 != var5) {
int var7 = Math.min(var3, var6);
int var8 = 0;
while(true) {
if (var8 >= var7) {
if (var3 >= var6) {
var13 = false;
return var13;
}
if (var5[var3] != var1) {
var3 = indexOf(var1, var5, var3, var6);
if (var3 < 0) {
var13 = false;
return var13;
}
}
break;
}
if (var5[var8] != var2[var8] && eq(var1, var5[var8])) {
var3 = var8;
break;
}
++var8;
}
}
Object[] var12 = new Object[var6 - 1];
System.arraycopy(var5, 0, var12, 0, var3);
System.arraycopy(var5, var3 + 1, var12, var3, var6 - var3 - 1);
this.setArray(var12);
var13 = true;
return var13;
} finally {
var4.unlock();
}
}
二、读操作
直接读取,无锁。
private E get(Object[] var1, int var2) {
return var1[var2];
}
public E get(int var1) {
return this.get(this.getArray(), var1);
}
三、总结
CopyOnWriteArrayList适合读操作(无锁)频繁,写操作(加锁)较少的场景。
CopyOnWriteArrayList线程安全,加锁的复制写操作导致效率低,同时内存占用高。
CopyOnWriteArrayList的迭代器不支持增删改。