问题背景

在多线程编程中,我们经常会遇到集合类的线程安全问题。Java中的ArrayList是一个常用的集合类,但它不是线程安全的。当多个线程同时操作同一个ArrayList实例时,可能会出现各种不可预料的问题。

问题演示

List<String> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {new Thread(() -> {list.add(UUID.randomUUID().toString().substring(0, 8));System.out.println(list);}, String.valueOf(i)).start();
}

运行上述代码,很可能会遇到以下异常:

  • ArrayIndexOutOfBoundsException:数组越界异常

  • ConcurrentModificationException:并发修改异常

  • 或者出现数据不一致的情况

为什么ArrayList线程不安全?

ArrayList的线程不安全主要体现在以下几个方面:

  1. add方法非原子操作add()操作涉及多个步骤(检查容量、扩容、赋值),在多线程环境下可能被中断

  2. modCount计数器:迭代过程中如果结构被修改,会抛出ConcurrentModificationException

  3. 可见性问题:一个线程的修改可能不会立即对其他线程可见

解决方案

方案一:使用Vector类

List<String> list = new Vector<>();

Vector是Java早期提供的线程安全集合类,通过在方法上添加synchronized关键字实现同步。

优点

  • 简单易用,直接替换即可

  • 保证强一致性

缺点

  • 性能较差,所有操作都需要获取锁

  • 过于保守的同步策略

方案二:使用Collections.synchronizedList()

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

这种方法返回一个同步包装器,将所有方法用synchronized块包装。

优点

  • 灵活性高,可以包装任意List实现

  • 与Vector类似的线程安全性

缺点

  • 性能仍然有损耗

  • 迭代时需要手动同步

// 迭代时需要额外同步
synchronized(list) {Iterator<String> it = list.iterator();while (it.hasNext()) {// 处理元素}
}

方案三:使用CopyOnWriteArrayList

List<String> list = new CopyOnWriteArrayList<>();

CopyOnWriteArrayList是JUC包中提供的线程安全集合,采用"写时复制"策略。

工作原理

  • 读操作:无锁,直接访问当前数组

  • 写操作:加锁,复制原数组,在新数组上修改,最后替换引用

优点

  • 读操作性能极高,适合读多写少的场景

  • 不会抛出ConcurrentModificationException

缺点

  • 写操作性能较差,需要复制整个数组

  • 内存占用较大

  • 数据弱一致性(读操作可能看不到最新的修改)

性能对比

实现方式读性能写性能一致性内存占用
ArrayList无保证
Vector强一致
Collections.synchronizedList强一致
CopyOnWriteArrayList极高弱一致

实际应用建议

  1. 读多写少的场景:优先考虑CopyOnWriteArrayList

  2. 写多读少的场景:考虑使用Collections.synchronizedList()Vector

  3. 高并发且需要高性能的场景:考虑使用并发容器如ConcurrentHashMap(对应List可以考虑分段锁实现)

  4. 单线程环境:直接使用ArrayList即可

总结

ArrayList的线程安全问题在多线程环境下必须重视。根据实际应用场景选择合适的线程安全方案至关重要:

  • 需要强一致性且不关心性能:VectorCollections.synchronizedList()

  • 读多写少且可以接受弱一致性:CopyOnWriteArrayList

  • 高性能要求:考虑自定义同步策略或使用更专业的并发容器

正确选择线程安全集合类,可以有效避免多线程环境下的各种诡异问题,提高程序的稳定性和性能。

注意:即使使用了线程安全的集合类,复合操作(如检查再添加)仍然可能需要额外的同步措施,这点需要特别注意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919752.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919752.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919752.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车辆方向数据集 - 物体检测

关于数据集 包含超过50,000 张图像中具有方向的车辆的 50,000 多万个注释。它通过同时提供车辆类别和方向来减少对方向进行分类的辅助神经网络的需求。 预训练权重 我们将继续添加在车辆方向数据集和合成车辆方向数据集上训练的各种对象检测模型。如果您需要一些特定的预训练权…

Nextcloud搭建教程:使用Docker在腾讯云服务器上自建私人云盘

更多云服务器知识&#xff0c;尽在hostol.com你那百兆光纤的宽带。你是否也曾看着自己最珍贵的家庭照片、最私密的个人文档&#xff0c;静静地躺在某个科技巨头的服务器上&#xff0c;感到过一丝丝的不安&#xff1f;你的数据&#xff0c;到底被如何“阅读”和“分析”&#xf…

【操作记录】MNN Chat Android App 构建笔记(二)

&#x1f4d2; MNN Chat Android App 构建笔记 一、背景知识MNN 简介 MNN 是阿里开源的轻量级深度学习框架&#xff0c;支持 Android / iOS / Linux / Windows。提供推理、LLM、Vision、Audio 等模块。Android App 里用到的是 Java JNI 调用 MNN 库。CMake NDK 的作用 CMake&…

如何在 Axios 中处理多个 baseURL 而不造成混乱

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

AP服务发现PRS_SOMEIPSD_00255 的解析

[PRS_SOMEIPSD_00255 ] 「SOME/IP-SD头部的重启标志&#xff0c;对于重启后发出的所有报文&#xff0c;都应设置为 1&#xff0c;直至 SOME/IP头部中的会话 ID (Session-ID) 回绕并因此再次从 1 开始。在此回绕之后&#xff0c;重启标志应设置为 0。」(RS_SOMEIPSD_00006)核心含…

纯手撸一个RAG

纯手撸一个RAGRAG基本流程第一阶段&#xff1a;数据预处理&#xff08;索引&#xff09; - 构建知识库第二阶段&#xff1a;查询与生成&#xff08;推理&#xff09; - 回答问题总结Chunk介绍Chunk框架的介绍Chunk核心概念选择分块策略和框架如何选择分块框架Python代码实现第一…

视觉语言对比学习的发展史:从CLIP、BLIP、BLIP2、InstructBLIP(含MiniGPT4的详解)

前言 本文一开始是属于此文《图像生成(AI绘画)的发展史&#xff1a;从CLIP、BLIP、InstructBLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion(含ControlNet详解)》的&#xff0c;后独立成本文 第一部分 从CLIP、BLIP1、BLIP2到InstructBLIP 1.1 CLIP&#xff1a;基于对比文本…

HTTP代理与SOCKS代理的区别、应用场景与选择指南

在互联网日常使用与跨境业务中&#xff0c;HTTP代理 和 SOCKS代理 是两种常见的网络代理方式。无论是跨境电商、社交媒体账号运营、数据采集&#xff0c;还是科学访问海外资源&#xff0c;都需要选择合适的代理协议。什么是HTTP代理&#xff1f;定义HTTP代理 是基于 HTTP协议 的…

AI重塑职业教育:个性化学习计划提效率、VR实操模拟强技能,对接就业新路径

职业教育长期面临着一系列问题&#xff0c;包括“统一课程难以适配不同基础学员”、“实操反馈滞后”和“就业技能与企业需求脱节”等。随着人工智能技术的应用&#xff0c;这些传统教学模式正在发生变化。个性化技能培养得以实现&#xff0c;甚至可以提前识别学员的就业短板。…

主题配色下的背景透明度

用 CSS color-mix() 解决背景透明度的痛点 在设计卡片组件时&#xff0c;经常遇到这样的需求&#xff1a;卡片背景需要80%透明度&#xff0c;鼠标悬浮在内部某项时&#xff0c;修改背景色但保持同样的透明度。 问题场景 .card {background: rgba(59, 130, 246, 0.8); /* 蓝色80…

【Python代码】谷歌专利CSV处理函数

以下是一个重构后的高可用、可配置、低耦合的专利CSV处理函数&#xff0c;包含清晰的注释和结构&#xff1a; import csv import pandas as pd from datetime import datetime import os from typing import List, Dict, Any, Optional, Tuple import logging# 配置日志 loggin…

3-2〔OSCP ◈ 研记〕❘ WEB应用攻击▸WEB安全防护体系

郑重声明&#xff1a; 本文所有安全知识与技术&#xff0c;仅用于探讨、研究及学习&#xff0c;严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任&#xff0c;本人不承担任何责任。 如需转载&#xff0c;请注明出处且不得用于商业盈利。 …

PCIe 5.0相比顶级PCIe 4.0有何提升?

还在为PCIe 4.0固态硬盘那7000MB/s的速度沾沾自喜&#xff1f;醒醒&#xff0c;朋友。当很多人还在讨论PCIe 4.0是否“性能过剩”时&#xff0c;真正面向未来的PCIe 5.0已经带着碾压级的实力&#xff0c;来到了我们面前。这不是一次常规的“升级”&#xff0c;更不是英特尔式的…

23种设计模式——适配器模式(Adapter)​详解

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 设计模式 ✨特色专栏&#xff1a; 知识分享 &…

Vue3源码reactivity响应式篇之Reactive

概览 vue3中reactive用于将普通对象转换为响应式对象&#xff0c;它的实现原理是通过Proxy和Reflect来实现的。具体的实现文件参见packages\reactivity\src\reactive.ts。本文会介绍reactive的相关api如下&#xff1a; reactive&#xff1a;将普通对象转换为响应式对象readonly…

初识数据结构——Map和Set:哈希表与二叉搜索树的魔法对决

数据结构专栏 ⬅(click) 大家好&#xff01;我是你们的老朋友——想不明白的过度思考者&#xff01;今天我们要一起探索Java中两个神奇的数据结构&#xff1a;Map和Set&#xff01;准备好了吗&#xff1f;让我们开始这场魔法之旅吧&#xff01;&#x1f3a9; &#x1f3af; 先…

Unreal Engine UStaticMeshComponent

UnrealUnreal Engine - UStaticMeshComponent&#x1f3db; 定义&#x1f3db; 类继承⚡ 关键特性⚙️ 常见配置&#x1f6e0;️ 使用方法&#x1f4da; 在 C 中使用&#x1f4da; 在蓝图中使用&#x1f3ae; 典型应用场景&#x1f4da; 常见子类与用途&#x1f4dd; 小结Unrea…

demo 汽车之家(渲染-筛选-排序-模块抽离数据)

效果图展示&#xff1a;代码截图注释详情实现笔记总体目标&#xff08;按需求点对照代码&#xff09;数据模块化、整体渲染框架、筛选/排序的高亮与行为&#xff0c;全部已在 Index.ets CarData.ets 落地。下面按图片需求 2~4 点逐条总结&#xff0c;并给出关键代码定位与“为…

双重机器学习DML介绍

本文参考&#xff1a; [1]文心一言回答&#xff1b; 一、核心原理与数学框架 双重机器学习&#xff08;Double Machine Learning, DML&#xff09;由Chernozhukov等学者于2018年提出&#xff0c;是一种结合机器学习与传统计量经济学的因果推断框架。其核心目标是在高维数据和非…

【图像算法 - 21】慧眼识虫:基于深度学习与OpenCV的农田害虫智能识别系统

摘要&#xff1a; 在现代农业生产中&#xff0c;病虫害是影响作物产量和品质的关键因素之一。传统的害虫识别依赖人工巡查&#xff0c;效率低、成本高且易出错。本文将介绍如何利用深度学习与OpenCV构建一套高效的农田害虫智能识别系统。该系统能够自动识别10类常见农业害虫&a…