java-collection-CopyOnWriteArrayList

特点

线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现,是一种读写分离的并发策略,我们也可以称这种容器为”写时复制器”

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

一个线程安全的{@link java.util.ArrayList} 变体 所有变体操作({@code add}, {@code set} 由 制作底层数组的新副本实现。
这通常成本太高了,但可能是更有效而不是可供选择的 当遍历操作大大超过突变,
并且是可用的 当你不能或者不想同步遍历 它是有用的。
“快照”样式迭代器方法使用一个参考数组的状态 在iterator被创建的时候。
这个数组在Iterator生命周期中永远不会改变。
因此干扰是不可能的 而且这个迭代器 保证不抛出ConcurrentModificationException。
这个迭代器不反映添加 移除 或更改对于这个list 自从iterator被创建后。
Element-changing操作在迭代器自身的 ({@code remove}, {@code set}, and
* {@code add}) 是不支持的。这些方法会抛出 {@code UnsupportedOperationException}.

所有元素是允许的 包含null

内存一致性效应:
与其他并发集合一样,操作线程优先将对象放入一个{@code CopyOnWriteArrayList}
随后另一个线程对{@code CopyOnWriteArrayList} 进行访问操作或者元素的移除。

这里写图片描述

优缺点

 优点:

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

  缺点:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值