乱弹java并发(三)-- CopyOnWriteArrayList和CopyOnWriteArraySet
来源:互联网 发布:吴亦凡 扒皮 知乎 编辑:程序博客网 时间:2024/05/17 07:22
CopyOnWriteArrayList是基于“写时复制”策略的线程安全的数组,它的特点是写加锁读不加锁,了解过ConcurrentHashMap的原理之后,再理解它的原理就比较简单了,来看看两个关键方法:
public boolean add(E e) {final ReentrantLock lock = this.lock;lock.lock();try { Object[] elements = getArray(); int len = elements.length; Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true;} finally { lock.unlock();} } public E get(int index) { return (E)(getArray()[index]); } final Object[] getArray() { return array; }从代码中可以看到,在往数组中添加元素时,把整个数组拷贝一份把数据插入到新数组中,然后用新数组代替老数组,这样保证多个线程不会再同一个时间点读到不一致的数据,在插入时加了全局锁,所以多个线程不能同时插入数据,而读操作时完全没有锁的,这里面array时一个volatile变量,这点很关键,在插入操作的最后设置这个volatile变量,由volatile在JMM中的happens-before语义,已及hp的传递性,保证了写操作完成之后,写操作更新的数据对读线程时可见的。和ConcurrentHashMap一样,CopyOnWriteArrayList也只能保证弱一致性。由于CopyOnWriteArrayList写操作要拷贝整个数组,所以整个操作对时间的消耗和对GC产生的压力都是比较可观的,而读操作由于无锁,所以读操作比较高效而且读线程之间不会发生阻塞,所以这个结构适用于读操作远远多于写操作的场景。
CopyOnWriteArraySet完全时基于CopyOnWriteArrayList来实现的,这里不再赘述。
0 0
- 乱弹java并发(三)-- CopyOnWriteArrayList和CopyOnWriteArraySet
- 并发容器之CopyOnWriteArrayList和CopyOnWriteArraySet
- JUC (三)—— CopyOnWriteArrayList、CopyOnWriteArraySet
- JAVA多线程 之 CopyOnWriteArrayList和CopyOnWriteArraySet
- 使用 CopyOnWriteArrayList 和 CopyOnWriteArraySet
- CopyOnWriteArrayList和CopyOnWriteArraySet
- Java并发编程与技术内幕:CopyOnWriteArrayList、CopyOnWriteArraySet源码解析
- java.util.concurrent.CopyOnWriteArrayList CopyOnWriteArraySet
- 《Java源码分析》:CopyOnWriteArrayList/ CopyOnWriteArraySet
- 《Java源码分析》:CopyOnWriteArrayList/ CopyOnWriteArraySet
- CopyOnWriteArraySet<E>和CopyOnWriteArrayList<E>
- Java中的Copy-On-Write容器,CopyOnWriteArrayList和CopyOnWriteArraySet
- CopyOnWriteArrayList&CopyOnWriteArraySet
- 【Java】并发容器ConcurrentHashMap和CopyOnWriteArrayList(一)
- java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍
- 乱弹java并发(一)-- BlockingQueue
- 乱弹java并发(二)-- ConcurrentHashMap
- 乱弹java并发(四)-- ThreadPoolExecutor
- 【HDU】 2795 Billboard(线段树)
- html
- 13.2 连接到世界银行
- TIMER/COUNTER输入捕获与输出比较
- Java4Andriod 从零学起 ---learn7
- 乱弹java并发(三)-- CopyOnWriteArrayList和CopyOnWriteArraySet
- 初探NO.3—从头到尾聊聊贝叶斯的分类方法
- UVA 10487 Closest Sums(二分)
- 最大连续子序和 (加强版?)
- java.sql.SQLException:Invalid value for getInt()-'zhangsan'
- Let the Balloon Rise
- PHP HttpClient模拟登陆
- 新站必须经过的几个百度时期
- 在安卓service中启动相机