Copy-On-Write简称COW,是一种用于程序设计的优化策略。JDK有两种Copy-On-Write容器,CopyOnWriteArrayList和CopyOnWriteArraySet。
Copy-On-Write容器,就是写时复制容器。支持并发的读,如果是写操作,那么会创建一个新的容器,在新的容器中完成写操作,在这个过程中,读操作依然读的是旧容器中的值。完成写操作之后,还会把新容器的引用指向原有容器的引用。这样做的好处就是,可以支持并发的读,而不需要加锁,因为当前容器不会添加或者删除元素。所以Copy-On-Write容器是一种读写分离容器,体现了读写分离的思想。
CopyOnWriteArrayList源码分析:
private volatile transient Object[] array;
final Object[] getArray() {
return array;
}
final void setArray(Object[] a) {
array = a;
}
将array设置为私有的,只能通过本类的get和set方法操作array。
- 更新操作
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 {