看分布式架构的时候看到了写时复制,记录一下
写时复制,顾名思义就是在进行写操作的时候,进行数据copy,是一种读写分离的处理方式。
在执行数据修改操作时,进行底层数组复制,使修改操作在新的数组上面进行,不影响原数组的并发读操作,修改之后再将原数组引用改写到更新后的数据。
适用与大量读操作,少量写操作的场景,且会造成数据更新的延迟,不能保证实时性,只保证了最终一致性。
使用方法:ReentrantLock使并发写互斥执行。
实现机制:CopyOnWriteArrayList(CopyOnWriteArraySet:避免重复数据的List)
操作:读size(), isEmpty(), indexOf(), contains(), get()
写set(), add(), remove()
读不加锁,写加锁
public E get(int index) {
return get(getArray(), index);
}
public E get(Object[] a, int index) {
return (E)a[index];
}
public E set(int index, E element) {
final ReentrantLock lock = this.lock;
lock.lock(); // 加锁
try{
Object[] elements = getArray();
E oldValue = get(elements, index);
if(oldValue != element) {
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len);
newElements[index] = element;
setArray(newElements);
} else {
setArray(elements);
}
return oldValue;
} finally {
lock.unlock();
}
}