java.util.concurrent 之CopyOnWriteArrayList
2017-01-20 09:32
323 查看
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
CopyOnWriteArrayList的使用场景
通过上面的分析,
1、由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致
2、不能用于实时读的场景,像拷贝数组、新增元素都需要时间,所以调用一个
CopyOnWriteArrayList透露的思想
如上面的分析CopyOnWriteArrayList表达的一些思想:
1、读写分离,读和写分开
2、最终一致性
3、使用另外开辟空间的思路,来解决并发冲突
什么是CopyOnWrite容器
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。CopyOnWriteArrayList的使用场景
通过上面的分析,
CopyOnWriteArrayList有几个缺点:
1、由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致
young gc或者
full gc
2、不能用于实时读的场景,像拷贝数组、新增元素都需要时间,所以调用一个
set操作后,读取到数据可能还是旧的,虽然
CopyOnWriteArrayList能做到最终一致性,但是还是没法满足实时性要求;
CopyOnWriteArrayList合适读多写少的场景,比如说缓存。
CopyOnWriteArrayList透露的思想
如上面的分析CopyOnWriteArrayList表达的一些思想:
1、读写分离,读和写分开
2、最终一致性
3、使用另外开辟空间的思路,来解决并发冲突
相关文章推荐
- java.util.concurrent.CopyOnWriteArrayList
- java.util.concurrent.CopyOnWriteArrayList CopyOnWriteArraySet
- java.util.concurrent.CopyOnWriteArrayList
- 《java.util.concurrent 包源码阅读》08 CopyOnWriteArrayList和CopyOnWriteArraySet
- Java中 CopyOnWriteArrayList 的使用与ConcurrentModificationException错误的避免
- Java concurrent Framework并发容器之CopyOnWriteArrayList(1.6)源码分析
- JAVA提高二十:CopyOnWriteArrayList&CopyOnWriteArraySet&ConcurrentHashMap介绍
- Java线程集合类ConcurrentHashMap&CopyOnWriteArrayList 深入
- Java Concurrent --CopyOnWriteArrayList
- java.util.concurrent.CopyOnWriteArraySet
- Java:concurrent包下面的Collection接口框架图( CopyOnWriteArraySet, CopyOnWriteArrayList,ConcurrentLinkedQueue,BlockingQueue)
- java.util中ArralyList 与 CopyOnWriteArrayList
- ArrayList 的java.util.ConcurrentModificationException异常?
- arraylist 遇到java.util.ConcurrentModificationException真正原因。
- Java 7之多线程并发容器 - CopyOnWriteArrayList
- 为什么java.util.concurrent 包里没有并发的ArrayList实现?
- CopyOnWriteArrayList/ConcurrentHashMap
- Java中 CopyOnWriteArrayList 的使用
- JAVA 笔记 CopyOnWriteArrayList
- 为什么java.util.concurrent 包里没有并发的ArrayList实现?