您的位置:首页 > 编程语言 > Java开发

java.util.concurrent 之CopyOnWriteArrayList

2017-01-20 09:32 323 查看
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。


什么是CopyOnWrite容器

CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

CopyOnWriteArrayList的使用场景

通过上面的分析,
CopyOnWriteArrayList
 有几个缺点: 

1、由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致
young
gc
或者
full gc


2、不能用于实时读的场景,像拷贝数组、新增元素都需要时间,所以调用一个
set
操作后,读取到数据可能还是旧的,虽然
CopyOnWriteArrayList
 能做到最终一致性,但是还是没法满足实时性要求;

CopyOnWriteArrayList
 合适读多写少的场景,比如说缓存。 

CopyOnWriteArrayList透露的思想

如上面的分析CopyOnWriteArrayList表达的一些思想: 

1、读写分离,读和写分开 

2、最终一致性 

3、使用另外开辟空间的思路,来解决并发冲突
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: