点击领取优惠~
499 字
2 分钟
CopyOnWriteArrayList的了解
CopyOnWriteArrayList的了解
Copy-On-Write 是什么?
在计算机中就是当你想要对一块内存进行修改时,我们不在原有内存块中进行写操作,而是将内存拷贝一份,在新的内存中进行写操作,写完之后呢,就将指向原来内存指针指向新的内存,原来的内存就可以被回收掉。
原理:
CopyOnWriteArrayList这是一个ArrayList的线程安全的变体,CopyOnWriteArrayList 底层实现添加的原理是先copy出一个容器(可以简称副本),再往新的容器里添加这个新的数据,最后把新的容器的引用地址赋值给了之前那个旧的的容器地址,但是在添加这个数据的期间,其他线程如果要去读取数据,仍然是读取到旧的容器里的数据。
优点和缺点:
优点:
-
据一致性完整,为什么?因为加锁了,并发数据不会乱。
-
解决了像ArrayList、Vector这种集合多线程遍历迭代问题,记住,Vector虽然线程安全,只不过是加了synchronized关键字,迭代问题完全没有解决!
缺点:
-
内存占有问题:很明显,两个数组同时驻扎在内存中,如果实际应用中,数据比较多,而且比较大的情况下,占用内存会比较大,针对这个其实可以用ConcurrentHashMap来代替。
-
数据一致性
容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。
使用场景:
-
读多写少(白名单,黑名单,商品类目的访问和更新场景),为什么?因为写的时候会复制新集合。
-
集合不大,为什么?因为写的时候会复制新集合。
-
实时性要求不高,为什么,因为有可能会读取到旧的集合数据。
CopyOnWriteArrayList的了解