0

0

在Java中如何使用CopyOnWriteArrayList实现线程安全列表_CopyOnWriteArrayList集合实践

P粉602998670

P粉602998670

发布时间:2025-11-19 10:12:47

|

585人浏览过

|

来源于php中文网

原创

CopyOnWriteArrayList是读多写少场景下的线程安全列表,通过写时复制实现高效读取,适用于弱一致性、低频写入的并发环境。

在java中如何使用copyonwritearraylist实现线程安全列表_copyonwritearraylist集合实践

在多线程环境下,对集合的并发访问容易引发数据不一致或异常。Java 提供了多种线程安全的集合类,其中 CopyOnWriteArrayListList 接口的一个线程安全实现,特别适用于读多写少的场景。

什么是 CopyOnWriteArrayList

CopyOnWriteArrayListjava.util.concurrent 包下的一个并发集合类。它的核心机制是“写时复制”(Copy-On-Write):当对列表进行修改操作(如 add、set、remove)时,它不会直接修改原数组,而是先复制一份新的数组,在新数组上完成修改,然后将容器的引用指向新数组。整个过程对读操作无锁,保证了读取的高效性。

这种设计使得 读操作完全无锁、线程安全且高性能,而写操作由于涉及数组复制,开销较大,因此适合 读远多于写 的并发场景。

基本使用方法

创建和使用 CopyOnWriteArrayList 与普通 ArrayList 非常相似,区别在于它是线程安全的。

立即学习Java免费学习笔记(深入)”;

  • 添加元素:调用 add() 方法
  • 删除元素:调用 remove() 方法
  • 获取元素:调用 get() 方法
  • 遍历列表:支持增强 for 循环或迭代器

示例代码:

Hitems
Hitems

HITEMS是一个AI驱动的创意设计平台,支持一键生成产品

下载
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteExample {
    private static CopyOnWriteArrayList list = new CopyOnWriteArrayList<>();

    public static void main(String[] args) {
        // 启动多个线程读取
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                while (true) {
                    for (String s : list) {
                        System.out.println("读取: " + s);
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        break;
                    }
                }
            }).start();
        }

        // 单独线程写入
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                list.add("元素" + i);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

在这个例子中,多个线程同时读取列表内容,另一个线程周期性地添加元素。由于 CopyOnWriteArrayList 的特性,读线程不会因为写操作而抛出 ConcurrentModificationException,也不会阻塞。

适用场景与注意事项

CopyOnWriteArrayList 并非适用于所有并发场景,需结合其特点合理使用。

  • 适合读多写少:例如监听器列表、配置缓存、事件广播等场景。
  • 写操作成本高:每次写都会复制整个数组,大数据量时性能较差。
  • 弱一致性迭代器:迭代器基于快照创建,不会反映后续的写操作,也不能调用 remove() 方法。
  • 实时性要求不高:读操作可能读到旧数据,不适合强一致性要求的场景。
  • 避免频繁写操作:高频率写入会导致频繁复制,影响整体性能。

与同步包装类对比

传统方式可通过 Collections.synchronizedList() 获得线程安全的 List:

List syncList = Collections.synchronizedList(new ArrayList<>());

这种方式对所有操作加锁,读写互斥,性能不如 CopyOnWriteArrayList 在读多场景下的表现。但在写操作频繁时,CopyOnWriteArrayList 反而更慢。

基本上就这些。CopyOnWriteArrayList 是一种以空间换时间、读写分离的经典实现,理解其原理和适用边界,才能在实际开发中正确选用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1130

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

213

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1713

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

20

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

503

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

166

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

15

2026.01.21

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 52.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号