Ch13-Java Collections 之 CopyOnWriteArrayList

Ch13-Java Collections 之 CopyOnWriteArrayList

March 14, 2020
Java | JUC
java

java.util.concurrent.CopyOnWriteArrayList

CopyOnWriteArrayList 容器允许并发读,读操作是无锁的,性能较高。至于写操作,比如向容器中添加一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的引用指向新容器。

structure

1. 添加 #

操作 操作成功 操作失败
add 返回 true

1.1 add 说明 #

首先获取 lock 对队列进行进行加锁,然后获取当前队列,获取队列长度 len,接着创建新的队列,且长度为 len+1,最后将旧队列中的元素 copy 到新的队列。最后释放 lock。

2. 获取 #

操作 操作成功 操作失败
get 返回元素

3. 优缺点分析 #

3.1 优点 #

读操作性能很高,因为无需任何同步措施,比较适用于读多写少的并发场景。Java 的 list 在遍历时,若中途有别的线程对 list 容器进行修改,则会抛出 ConcurrentModificationException 异常。而 CopyOnWriteArrayList 由于其"读写分离"的思想,遍历和修改操作分别作用在不同的 list 容器,所以在使用迭代器进行遍历时候,也就不会抛出 ConcurrentModificationException 异常了

3.2 缺点 #

缺点也很明显,一是内存占用问题,毕竟每次执行写操作都要将原容器拷贝一份,数据量大时,对内存压力较大,可能会引起频繁 GC;二是无法保证实时性,Vector 对于读写操作均加锁同步,可以保证读和写的强一致性。而 CopyOnWriteArrayList 由于其实现策略的原因,写和读分别作用在新老不同容器上,在写操作执行过程中,读不会阻塞但读取到的却是老容器的数据。

4. 参考文献 #