CopyOnWriteArrayList 是 Java 中的一个线程安全的 List

CopyOnWriteArrayList 是 Java 中的一个线程安全的 List 实现,属于 java.util.concurrent 包。它是一种支持并发读写操作的线程安全集合,它通过在每次修改操作时创建底层数组的副本来实现线程安全。

主要特点

复制代码
线程安全:所有的读取操作(如 get, iterator)不会被锁定,而写入操作(如 add, set, remove)则会创建底层数组的新副本,从而保证线程安全。
适合读多写少的场景:由于每次写操作都会创建数组的新副本,因此开销较大,但读取操作不会受到影响,非常适合读操作远多于写操作的场景。
迭代器弱一致性:返回的迭代器不会抛出 ConcurrentModificationException 并且能够容忍并发修改。

构造方法

复制代码
1.无参构造函数:创建一个空的 CopyOnWriteArrayList。
java 复制代码
CopyOnWriteArrayList<E> list = new CopyOnWriteArrayList<>();

2.使用现有集合初始化:使用另一个集合中的元素来初始化。

java 复制代码
CopyOnWriteArrayList<E> list = new CopyOnWriteArrayList<>(Collection<? extends E> c);

3.使用数组初始化:使用一个数组中的元素来初始化。

java 复制代码
CopyOnWriteArrayList<E> list = new CopyOnWriteArrayList<>(E[] array);

常用方法

复制代码
添加元素:
    boolean add(E e)
    void add(int index, E element)
    boolean addAll(Collection<? extends E> c)
    boolean addIfAbsent(E e)

获取元素:
    E get(int index)

删除元素:
    boolean remove(Object o)
    E remove(int index)

更新元素:
    E set(int index, E element)

检查元素:
    boolean contains(Object o)
    int size()
    boolean isEmpty()

使用示例

以下是一个简单的示例,展示了如何使用 CopyOnWriteArrayList:

java 复制代码
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListExample {
    public static void main(String[] args) {
        // 创建一个 CopyOnWriteArrayList 并添加一些元素
        List<String> list = new CopyOnWriteArrayList<>();
        list.add("Element 1");
        list.add("Element 2");
        list.add("Element 3");

        // 迭代列表
        for (String element : list) {
            System.out.println(element);
        }

        // 在迭代过程中添加元素,不会抛出 ConcurrentModificationException
        for (String element : list) {
            if ("Element 2".equals(element)) {
                list.add("New Element");
            }
        }

        System.out.println("After modification:");

        // 再次迭代列表,可以看到新添加的元素
        for (String element : list) {
            System.out.println(element);
        }
    }
}

注意事项

复制代码
1.性能问题:由于每次写操作(如添加、修改、删除)都需要复制整个底层数组,因此在写频繁的场景下性能可能会受到影响。
2.迭代器弱一致性:迭代器在创建时不会反映之后的修改,不过它仍然是线程安全的,不会抛出 ConcurrentModificationException。

总结

CopyOnWriteArrayList 是一种非常实用的线程安全集合,特别适合于读操作远多于写操作的场景。通过理解其工作原理和适用场景,你可以在实际项目中有效地利用它来处理并发问题。

相关推荐
前端工作日常3 小时前
我学习到的Java中domain和dto区别
java·后端
码农学院3 小时前
基于Spring Boot的跨境电商多语言订单管理系统架构设计
java·大数据·spring boot
技术小结-李爽4 小时前
【工具】pom文件的<packaging>
java·maven
l156469484 小时前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
zzq77974 小时前
加固包闪退四象限定位:targetSdk 与保护策略实战解析
android·安全·安卓·安全架构
Promise微笑5 小时前
智能激光清障仪选型指南:高效运维与安全保障的关键考量
运维·安全
布吉岛的石头5 小时前
Java 程序员第 45 阶段11:网关统一路由大模型接口,配合 Nacos 配置治理,灰度路由:基于Nacos元数据实现大模型服务灰度发布与权重路由
java·服务发现
我命由我123456 小时前
Android 开发问题:Cannot resolve method ‘repeat‘ in ‘String‘
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
baozhengw6 小时前
信创改造-SpringBootJar包改为WAR包部署Tomcat
java·tomcat
●VON6 小时前
鸿蒙 PC Markdown 编辑器存储安全:AtomicFile 原子提交与故障注入
安全·华为·编辑器·harmonyos·鸿蒙