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/

 

posted @   Authorization  阅读(78)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示