Java并发编程:CopyOnWriteArrayList
来源:互联网 发布:宾得k3ii知乎 编辑:程序博客网 时间:2024/06/07 13:19
CopyOnWrite容器
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
CopyOnWriteArrayList
该类在java.util.concurrent包中
CopyOnWriteArrayList,顾名思义,Write的时候总是要Copy,也就是说对于任何可变的操作(add、set、remove)都是伴随复制这个动作的
CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。
优点:
CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。发生修改时候做copy,新老版本分离,保证读的高性能,适用于以读为主的情况。
缺点:
CopyOnWriteArrayList采用“写入时复制”策略,对容器的写操作将导致的容器中基本数组的复制,性能开销较大。所以在有写操作的情况下,CopyOnWriteArrayList性能不佳,而且如果容器容量较大的话容易造成溢出。
CopyOnWriteArrayList,发生修改时候做copy,新老版本分离,保证读的高性能,适用于以读为主,读操作远远大于写操作的场景中使用,比如缓存。而Collections.synchronizedList则可以用CopyOnWriteArrayList不适用,但是有需要同步列表的地方,读写操作都比较均匀的地方。
CopyOnWriteArrayList是线程安全的
CopyOnWriteArrayList的使用场景
通过上面的分析,CopyOnWriteArrayList 有几个缺点:
1、由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致young gc或者full gc
2、不能用于实时读的场景,像拷贝数组、新增元素都需要时间,所以调用一个set操作后,读取到数据可能还是旧的,虽然CopyOnWriteArrayList 能做到最终一致性,但是还是没法满足实时性要求;
CopyOnWriteArrayList 合适读多写少的场景,不过这类慎用
因为谁也没法保证CopyOnWriteArrayList 到底要放置多少数据,万一数据稍微有点多,每次add/set都要重新复制数组,这个代价实在太高昂了。在高性能的互联网应用中,这种操作分分钟引起故障。
CopyOnWriteArrayList特点
如上面的分析CopyOnWriteArrayList表达的一些思想:
1、读写分离,读和写分开
2、最终一致性
3、使用另外开辟空间的思路,来解决并发冲突
参考:http://blog.csdn.net/lhl6688/article/details/43968583
http://blog.csdn.net/linsongbin1/article/details/54581787
http://www.importnew.com/25034.html
- Java并发编程---CopyOnWriteArrayList
- Java并发编程:CopyOnWriteArrayList
- Java并发编程:CopyOnWriteArrayList
- java并发编程之 CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- 【Java并发编程】并发容器之CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- java并发编程--并发容器CopyOnWriteArrayList
- Java并发编程:并发容器之CopyOnWriteArrayList
- 1014. Product of Digits
- 浅析AOP及其实现
- IDEA更换SVN地址
- ptmalloc内存分配分析
- js的数组与字符串互相转换
- Java并发编程:CopyOnWriteArrayList
- 动画
- NOI2005 维护数列
- yeoman一键生成前端项目代码
- 更新hosts,sudo:无法解析主机,rcnscd: command not found
- Cookie类基本的使用
- upD79F8513A(NEC)或upD78F0511A(NEC)之串口0中断发送和接收数据
- this关键字
- C++ 学习笔记