Java 的 CopyOnWriteArrayList 和 Collections.synchronizedList 有什么区别?分别有什么优缺点?

ops/2025/3/18 21:23:59/

CopyOnWriteArrayList

问题:什么是 CopyOnWriteArrayList

解答

CopyOnWriteArrayList 是 Java 并发包 (java.util.concurrent) 提供的一种 线程安全List 实现,它的核心特性是 写时复制(Copy-On-Write)。即,每当执行修改操作(如 add()set()remove())时,都会创建 一个新的数组,修改操作会在这个新数组上进行,操作完成后再将新数组赋值给 CopyOnWriteArrayList 的内部变量。


核心特性

  1. 线程安全:由于读操作不需要加锁,多个线程可以并发访问,而写操作是通过复制新数组实现的,因此不会影响读取操作。
  2. 读写分离:读操作 (get()iterator()) 直接访问旧数组,不需要加锁;写操作 (add()set()remove()) 创建新数组,保证了读写的并发安全。
  3. 适用于读多写少的场景:由于写操作的成本较高(复制整个数组),CopyOnWriteArrayList 适合 读多写少 的应用场景,例如缓存、白名单、黑名单等。

源码分析

构造方法
java">public CopyOnWriteArrayList() {setArray(new Object[0]);
}

底层是一个 Object 数组,存储数据时会复制数组。

写操作

示例:add() 方法

java">public boolean add(E e) {final ReentrantLock lock = this.lock;lock.lock(); // 加锁保证写操作的线程安全try {Object[] elements = getArray();int len = elements.length;Object[] newElements = Arrays.copyOf(elements, len + 1); // 复制新数组newElements[len] = e;setArray(newElements); // 替换数组return true;} finally {lock.unlock();}
}

分析

  • 先获取当前数组 elements
  • 复制新数组 newElements,并将新元素放入其中。
  • setArray(newElements) 替换原数组,实现更新。
读操作

示例:get() 方法

java">public E get(int index) {return getArray(index);
}

分析

  • 直接读取数组,无需加锁,效率高。
遍历

CopyOnWriteArrayList 通过 iterator() 进行遍历:

java">public 

http://www.ppmy.cn/ops/166871.html

相关文章

CSS中z-index使用详情

定位层级 1.定位元素的显示层级比普通元素高,无论什么定位,显示层级都是一样的; 2.如果位置发生重叠,默认情况是:后面的元素,会显示在前面元素之上; 3.可以通过CSS属性z-index调整元素的显示层级; 4.z-index的属性值是数字,没有单位,值越大显示层级越高; 5.只有定位的元素…

上下文微调(Contextual Fine-Tuning, CFT)提高大型语言模型(LLMs)在特定领域的学习和推理能力

大型语言模型(LLMs)在开放领域任务中表现出色,但在快速演变的专业领域(如医学、金融)中面临挑战: 知识更新难题:传统指令微调(Instruction Fine-Tuning, IFT)依赖显式指令,难以适应动态知识。灾难性遗忘:持续预训练(Continued Pretraining, CPT)可能导致模型遗忘已…

WPF未来展望:紧跟技术发展趋势,探索新的可能性

WPF未来展望:紧跟技术发展趋势,探索新的可能性 一、前言二、WPF 与.NET 技术的融合发展2.1 拥抱.NET Core2.2 利用.NET 5 及后续版本的新特性 三、WPF 在新兴技术领域的应用拓展3.1 与云计算的结合3.2 融入物联网生态 四、WPF 在用户体验和设计方面的创新…

密码学研究热点

一、后量子密码学 抗量子算法研究 开发能够抵抗量子计算机攻击的加密算法,如基于格的密码学(LWE、NTRU)、基于同源的密码学(Isogeny)和基于编码理论的密码学。 标准化进程 NIST等机构正推动后量子密码算法的标准化…

审批工作流系统xFlow

WorkFlow-审批流程系统 该项目为完全开源免费项目 可用于学习或搭建初始化审批流程系统 希望有用的小伙伴记得点个免费的star gitee仓库地址 仿钉钉飞书工作审批流系统 介绍 前端技术栈: vue3 ts vite arcodesign eslint 后端技术栈:springbootspring mvc mybatis mavenmysq…

android.widget包介绍

android.widget 是 Android 开发中用于构建用户界面(UI)的核心包之一。它包含了大量的 UI 控件(如按钮、文本框、列表等),这些控件通常被称为“小部件”(Widget)。android.widget 包中的类大多继…

windows协议不再续签,华为再无windows可用,将于四月发布鸿蒙PC

大家好,我是国货系创始人张云泽,最近不少小伙伴在后台问:“听说Windows协议要到期了?我的电脑会不会变砖?”还有人说:“华为笔记本以后用不了Windows了?鸿蒙系统能用吗?”今天咱们就…

todolist docker 小工具

参考链接 前排提示 没有中文,可使用浏览器 翻译 前提 安装docker安装docker-compose 下载仓库 git clone https://github.com/JordanKnott/taskcafe进行安装 cd taskcafe docker-compose -p taskcafe up -d服务启动后会监听在 3333 端口上,通过浏览器…