CopyOnWriteArrayList是一个线程安全的ArrayList,它的底层是通过ReentrantLock()实现的。
//空参构造器创建了一个空数组
public CopyOnWriteArrayList() {
setArray(new Object[0]);
}
final void setArray(Object[] a) {
array = a;
}
// array 被volatile修饰,内存中修改可见
private transient volatile Object[] array;
// CopyOnWriteArrayList的元素添加方法
public boolean add(E e) {
//获取可重入锁
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();//获取array数组
int len = elements.length;//当前数组的长度
//每次新增元素都要进行,都需要进行拷贝,旧的数组,然后容量加1
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;//将当前需要新增的元素赋值给newElements[len]
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
final Object[] getArray() {
return array;
}