CopyOnWriteArrayList 解说
前景:
上节讨论过ConcurrentHashMap使用中的注意点,本节来着重讲解一下CopyOnWriteArrayList需要注意些什么呢?
辨别并发工具的使用场景
说到CopyOnWriteArrayList,我们首先想到的肯定是CopyOnWrite,这是个时髦的技术,不管是 Linux 还是 Redis 都会用到。
那么在我们Java中,虽然CopyOnWriteArrayList是个线程安全的ArrayList,但是当我们探索时会发现,他的实现方式其实是每次修改数据时都会复制一份数据出来,这样就显而易见导致了性能问题了。
所以我们在使用这些并发工具的时候,一定要区分适用场景,即读多写少或者说希望无锁读的场景。千万不要直接上套!
那么为什么CopyOnWriteArrayList会导致性能问题呢?
1 2 3 4 5 | /** * *此处性能demo实验省略..... <br> *直接上结果 * */ |
在我们大量add操作过程中CopyOnWriteArray 几乎比同步的 ArrayList 慢一百倍:
而在大量read过程中,CopyOnWriteArray 又比同步的 ArrayList 快五倍以上:
这样我们就可以看出来CopyOnWriteArray真的只适合大量的read场景下,导致这个原因无非就是咱们的源码当中:
以 add 方法为例,每次 add 时,都会用 Arrays.copyOf 创建一个新数组,频繁 add 时内存的申请释放消耗会很大
/** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return {@code true} (as specified by {@link Collection#add}) */ public boolean add(E e) { synchronized (lock) { Object[] elements = getArray(); int len = elements.length; Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; } }
所以,当小伙伴们考虑使用并发工具的时候,一定要贴合场景,可能还需要压力测试模拟并发场景,来发现BUG或性能问题。
期待各位大佬评论区讨论~~ 当然有任何问题欢迎私信和留言~~~~~~~
谢谢各位支持!
注:转载请注明出处:https://www.cnblogs.com/jiahui-chen/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?