CopyOnWriteArrayList
CopyOnWrite容器即写时复制的容器,当我们往⼀个容器中添加元素的时候,不直接往容器中添加,⽽是将当前容器进⾏copy,复制出来⼀个新的容器,然后向新容器中添加我们需要的元素,最后将原容器的引⽤指向新容器,这个过程中是使用ReentrantLock加锁了的。这样做的好处在于,我们可以在并发的场景下对容器进⾏"读操作"⽽不需要"加锁",从⽽达到读写分离的⽬的。
优点: CopyOnWriteArrayList经常被⽤于“读多写少”的并发场景,是因为CopyOnWriteArrayList⽆需任何同步措施,⼤⼤增强了读的性能。在Java中遍历线程⾮安全的List(如:ArrayList和 LinkedList)的时候,若中途有别的线程对List容器进⾏修改,那么会抛出ConcurrentModificationException异常。CopyOnWriteArrayList由于其"读写分离",遍历和修改操作分别作⽤在不同的List容器,所以在使⽤迭代器遍历的时候,则不会抛出异常。
缺点: 第⼀个缺点是CopyOnWriteArrayList每次执⾏写操作都会将原容器进⾏拷⻉了⼀份,数据量⼤的时候,内存会存在较⼤的压⼒,可能会引起频繁FullGC(ZGC因为没有使⽤Full GC)。⽐如这些对象占⽤的内存⽐较⼤200M左右,那么再写⼊100M数据进去,内存就会多占⽤300M。第⼆个缺点是CopyOnWriteArrayList由于实现的原因,写和读分别作⽤在不同新⽼容器上,在写操作执⾏过程中,读不会阻塞,但读取到的却是⽼容器的数据。
本文来自博客园,作者:云哲,转载请注明原文链接:https://www.cnblogs.com/yyz0225/p/18006192
分类:
多线程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)