499 字
2 分钟
CopyOnWriteArrayList的了解

CopyOnWriteArrayList的了解#

Copy-On-Write 是什么?#

在计算机中就是当你想要对一块内存进行修改时,我们不在原有内存块中进行写操作,而是将内存拷贝一份,在新的内存中进行写操作,写完之后呢,就将指向原来内存指针指向新的内存,原来的内存就可以被回收掉。

原理:#

CopyOnWriteArrayList这是一个ArrayList的线程安全的变体,CopyOnWriteArrayList 底层实现添加的原理是先copy出一个容器(可以简称副本),再往新的容器里添加这个新的数据,最后把新的容器的引用地址赋值给了之前那个旧的的容器地址,但是在添加这个数据的期间,其他线程如果要去读取数据,仍然是读取到旧的容器里的数据。

优点和缺点:#

优点:

  1. 据一致性完整,为什么?因为加锁了,并发数据不会乱。

  2. 解决了像ArrayList、Vector这种集合多线程遍历迭代问题,记住,Vector虽然线程安全,只不过是加了synchronized关键字,迭代问题完全没有解决!

缺点:

  1. 内存占有问题:很明显,两个数组同时驻扎在内存中,如果实际应用中,数据比较多,而且比较大的情况下,占用内存会比较大,针对这个其实可以用ConcurrentHashMap来代替。

  2. 数据一致性容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。

使用场景:#

  1. 读多写少(白名单,黑名单,商品类目的访问和更新场景),为什么?因为写的时候会复制新集合。

  2. 集合不大,为什么?因为写的时候会复制新集合。

  3. 实时性要求不高,为什么,因为有可能会读取到旧的集合数据。

CopyOnWriteArrayList的了解
作者
强人自传
发布于
2025-03-14
许可协议
CC BY-NC-SA 4.0