什么是CopyOnWrite?
CopyOnWtire意为写入时复制
1.准备写入前,将旧数据复制一份作为副本,在副本上进行写入
2.写入完成后,用副本的引用替换旧数据的引用
所以在整个写入过程中,读取到的数据都是不变的,只有在写入完成后,新的读取操作所读取到的数据才会发生改变,从而保证了数据的最终一致性(注意,不是实时一致性)
以CopyOnWriteArrayList为例
//volatile保证了数据的可见性
//数据被任一线程修改 其余线程均可见(直接从内存中读取数据 而不是缓存中)
private transient volatile Object[] array;
public boolean add(E e) {
//锁
final ReentrantLock lock = this.lock;
//上锁
lock.lock();
try {
//创建副本
Object[] elements = getArray();
//数组扩容 在原先容量上 + 1
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
//写入
newElements[len] = e;
//替换引用
setArray(newElements);
return true;
} finally {
//解锁
lock.unlock();
}
}