学学JUC(三)-- CopyOnWriteArrayList和CopyOnWriteArraySet
2015-02-11 21:37
375 查看
CopyOnWriteArrayList是基于“写时复制”策略的线程安全的数组,它的特点是写加锁读不加锁,了解过ConcurrentHashMap的原理之后,再理解它的原理就比较简单了,来看看两个关键方法:
CopyOnWriteArraySet完全时基于CopyOnWriteArrayList来实现的,这里不再赘述。
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来实现的,这里不再赘述。
相关文章推荐
- JUC (三)—— CopyOnWriteArrayList、CopyOnWriteArraySet
- JUC源码分析24-队列-CopyOnWriteArrayList,CopyOnWriteArraySet
- Java多线程 -- JUC包源码分析2 -- Copy On Write/CopyOnWriteArrayList/CopyOnWriteArraySet
- Java多线程 -- JUC包源码分析2 -- Copy On Write/CopyOnWriteArrayList/CopyOnWriteArraySet
- 【JUC】JDK1.8源码分析之CopyOnWriteArraySet(七)
- 使用 CopyOnWriteArrayList 和 CopyOnWriteArraySet
- Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet
- java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍
- 《Java源码分析》:CopyOnWriteArrayList/ CopyOnWriteArraySet
- juc--CopyOnWriteArraySet
- Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet
- Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet
- JAVA 多线程随笔 (三) 多线程用到的并发容器 (ConcurrentHashMap,CopyOnWriteArrayList, CopyOnWriteArraySet)
- Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet
- JUC集合---CopyOnWriteArraySet
- 【JDK】:CopyOnWriteArrayList、CopyOnWriteArraySet 源码解析
- JAVA提高二十:CopyOnWriteArrayList&CopyOnWriteArraySet&ConcurrentHashMap介绍
- 《Java源码分析》:CopyOnWriteArrayList/ CopyOnWriteArraySet
- JAVA多线程 之 CopyOnWriteArrayList和CopyOnWriteArraySet
- JUC集合-03之 CopyOnWriteArraySet