1.CopyOnWriteArrayList(字译名称:写时复制),它可以看成是线程安全且读操作无锁的ArrayList。
2.使用场景:
读操作远远大于写操作,比如有些系统级别的信息,往往需要加载或者修改很少的次数,但是会被系统内的所有模块频繁的访问。
3.原理:
CopyOnWriteArrayList容器允许并发读,读操作时无锁的,性能高。写操作,比如向容器中添加一个元素,则首先将当前容器复制一份,然后在新的副本上执行写操作(此时仍然可以读取,读取的时旧的容器中的数据),结束之后再将原容器的引用指向新容器。
特点:这种链表,读取完全不用加锁,写入也不会阻塞读取,只有写入和写入之间需要进行同步等待。
缺点:1)占用内存,每次执行写操作都要将原容器拷贝一份,数据量大时,对内存压力较大,可能会引起频繁GC
2)无法保证实时性,Vector对于读写操作都同步,保证了读和写的一致性,但是CopyOnWriteArrayList,写和读分别作用在新老不同的容器上,在写的过程中,读不会阻塞,但是读取到的是老容器的数据。
(自己的一点理解: 其实普通的读也不会出现数据问题,但是涉及写操作就会出现数据问题,两个写线程就不说了,一读一写也是会出现问题的,例如原先数据:小明:15岁,现在写入小红:20岁,当刚刚写入小红,20岁还没写时,读操作来了,就读成了小红:15岁,这是数据出错的问题,而copyOnWriteArrayList不会出现脏读的问题,写时复制只是数据有延时。例如在写小红,20岁还没有写的时候,此时读的数据就是小明:15岁,不会出现小红:20岁的情况)
参考:
实战Java高并发程序设计
https://blog.csdn.net/linsongbin1/article/details/54581787
http://www.cnblogs.com/chengxiao/p/6881974.html