Copy-On-Write简称COW,是一种用于程序设计中的优化策略。
JDK里的COW容器有两种:CopyOnWriteArrayList和CopyOnWriteArraySet。COW容器非常有用,可以在非常多的并发场景中使用到。
下面简单介绍一下什么是COW容器:
CopyOnWrite容器即写时复制的容器。通俗的理解就是当我们往一个容器中添加元素时,不直接往当前容器添加,而是先将当前容器进行复制,复制出一个新的容器,然后往新的容器中添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写是不同的容器。
1、CopyOnWrite容器适合读多写少的场景。如果写多的话,每一次写都需要先复制一份新的容器再进行写操作,那么效率会非常的低,而且资源消耗也大。
2、CopyOnWrite容器,我们像正常操作容器一样即可。
CopyOnWriteArrayList例子,CopyOnWriteArraySet一样的用法:
public class Test {
public static void main(String[] args) {
//现在泛型指定为String,所以只能添加String类型数据
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
Iterator<String> ie = list.iterator(); //遍历也会正常遍历就行
while(ie.hasNext()){
String str = ie.next();
System.out.println(str);
}
}
}
3、添加方法的源码:
我们可以看到关于多线程的写操作,其实我们是不用担心并发问题的,因为方法里都是加上了锁。