ArrayList中多线程的不安全问题
ArrayList中的不安全问题
正常的输出
List<String> list = Arrays.asList("1","2","3");
list.forEach(System.out::println);
-
为什么可以这样输出,是一种函数是接口,我们先过个耳熟
-
Arrys.asList是返回一个ArrayList
-

-
传入的是可多个数量的参数
-
T是随意泛型
不安全的输入
List<Integer> list = new ArrayList<>();for (int i = 0; i < 10; i++) {int finalI = i;new Thread(() ->{list.add(finalI);System.out.println(list);},String.valueOf(i)).start();
}
多个线程同时去添加ArryList,出现了报错,抛出来异常ConcurrentModificationException 并发修改异常

ConcurrentModificationException
- 通常发生在尝试修改一个正在被另一个线程修改的结构时
- 这种异常常见于使用迭代器遍历集合时尝试修改集合本身的情况。
- 在Java的集合框架中,许多集合类(如
ArrayList,HashMap等)的迭代器是快速失败(fail-fast)的。这意味着如果在迭代过程中检测到集合的结构被修改(除了通过迭代器自身的remove方法),那么迭代器会立即抛出ConcurrentModificationException。
产生原因:
ArrayList.add方法是不安全的

解决方案
方案一:List list = new Vector();

-
这个方法是synchronized
-
不推荐 -
因为synchronized是不高效的行为
方案二:List list = Collections.synchronizedList(new ArrayList<>());
- 这样也是安全的
方案三List list = new CopyOnWriteArrayList<>();
- 这个是在JUC包下的

-
写入时复制
-
该方法使用了Lock锁,所以是安全的
-
我们仔细看下源码,可以看出来
- 先创建了一个Object的数组
- 得到了数组的长度
- 将原数组复制给新数组,并且长度+1
- 在新数组末尾加入新元素
- 最后将数组插入到list中
-
写入时复制,就是在写入时,先将原数据复制,再将需要的数据插入,最后返回给原数组
-
我们可以了解到Arraylist底层就是数组
相关文章:
ArrayList中多线程的不安全问题
ArrayList中的不安全问题 正常的输出 List<String> list Arrays.asList("1","2","3"); list.forEach(System.out::println);为什么可以这样输出,是一种函数是接口,我们先过个耳熟 Arrys.asList是返回一个ArrayL…...
ALTER TABLE 之 定点变更(in-place alter)
定点变更算法可以提供优于慢速变更算法的诸多性能优势: 定点变更算法: 1,增加了表的可用性 ALTER TABLE操作使用定点变更算法时,其他用户稍后可以访问该表,因为数据库服务器只在更新表定义和重建包含更改列的索引时才锁…...
【RAG实践】Rerank,让大模型 RAG 更近一步
RAGRerank原理 上一篇【RAG实践】基于LlamaIndex和Qwen1.5搭建基于本地知识库的问答机器人 我们介绍了什么是RAG,以及如何基于LLaMaIndex和Qwen1.5搭建基于本地知识库的问答机器人,原理图和步骤如下: 这里面主要包括包括三个基本步骤&#…...
私有化客服系统:在线客服搭建与部署的创新之路
随着互联网技术的飞速发展,企业与客户之间的沟通方式也在不断地演变。在这个信息爆炸的时代,一个高效、便捷、智能的在线客服系统成为了企业提升服务质量、增强客户满意度的重要工具。本文将详细介绍在线客服系统的构建、部署以及私有化客服的优势&#…...
VM-UNet: Vision Mamba UNet for Medical Image Segmentation
VM-UNet: Vision Mamba UNet for Medical Image Segmentation VM-UNet:基于视觉Mamba UNet架构的医学图像分割 论文链接:http://arxiv.org/abs/2402.02491 代码链接:https://github.com/JCruan519/VM-UNet 1、摘要 文中利用状态空间模型SS…...
面向对象编程:在Python中的面向对象编程奥秘
面向对象编程在Python中的奥秘 在编程的世界里,面向对象编程(Object-Oriented Programming,简称OOP)是一种非常重要的编程范式。它改变了我们思考问题和设计代码的方式。Python作为一种支持面向对象的语言,为我们提供…...
考研数学|零基础100分保底复习方案+资料分享
目标100分其实很好实现,只要你有决心,不需要去看任何人的学习技巧 其实基础差,你只要专攻基础就好了,现在的很多考研课程和资料真的很不照顾基础不好的同学,好像就默认你什么都会一样,但是还是有对于基础差…...
【MATLAB源码-第29期】基于matlab的MIMO,MISO,SIMO,SISO瑞利rayleigh信道容量对比。
操作环境: MATLAB 2022a 1、算法描述 1. SISO(单输入单输出): - SISO 是指在通信系统中,只有一个天线用于传输信号,也只有一个天线用于接收信号的情况。这是最简单的通信方式。 2. SIMO(单…...
JRT高效率开发
得益于前期的基础投入,借助代码生成的加持,本来计划用一周实现质控物维护界面,实际用来四小时左右完成质控物维护主体,效率大大超过预期。 JRT从设计之初就是为了证明Spring打包模式不适合软件服务模式,觉得Spring打包…...
Spring Boot 切面的一种的测试方法,java中级开发面试
void afterReturnName() { Assertions.assertEquals(studentController.getNameById(123L).getName(), "测试姓名Yz");} } 但往往切面中的逻辑并非这么简单,在实际的测试中其实我们也完成没有必要关心在切面中到底发生了什么(发生了什么应该在…...
嵌入式自学路线-高薪路线(持续更新,欢迎关注)
1 入门:51STM32 主要学习内容中断、定时器、串口、NAND FLASH、网络控制器、LCD屏、触摸屏等的工作原理。学习资源推荐视频:野火,正点原子书籍:野火,正点原子学习建议如果你以后的方向是驱动开发,这部分学…...
SpringMVC的运行流程
SpringMVC的运行流程可以概括为以下几个主要步骤: 用户发送请求: 用户通过浏览器或其他客户端发送HTTP请求到服务器。 前端控制器(DispatcherServlet)接收请求: SpringMVC的前端控制器(通常是DispatcherSe…...
成绩分析 蓝桥杯 java
成绩分析 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 请计算这次考试的最高分、最低分和平均分。 输入格式 输入的第一行包含一个整数 n,表示考试人数。 接下来 n 行,每行包含一…...
计算psnr ssim niqe fid mae lpips等指标的代码
以下代码仅供参考,路径处理最好自己改一下 # Author: Wu # Created: 2023/8/15 # module containing metrics functions # using package in https://github.com/chaofengc/IQA-PyTorch import torch from PIL import Image import numpy as np from piqa import P…...
OpenHarmony开发技术:【国际化】实例
国际化 如今越来的越多的应用都走向了海外,应用走向海外需要支持不同国家的语言,这就意味着应用资源文件需要支持不同语言环境下的显示。本节就介绍一下设备语言环境变更后,如何让应用支持多语言。 应用支持多语言 ArkUI开发框架对多语言的…...
c++子类和父类成员函数重名
子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数。子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,…...
《C++程序设计》阅读笔记【7-堆和拷贝构造函数】
🌈个人主页:godspeed_lucip 🔥 系列专栏:《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学,回复C程序设计获取下载链接。 1 堆与拷贝构造函数1.1 概述1.2 分配堆对象1.3 拷贝构造函数1.3.1 默…...
洛谷 P1048 [NOIP2005 普及组] 采药
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同…...
VMware vSphere虚拟化基础管理平台
VMware简介 VMware介绍 官网:https://www.vmware.com/cn.html VMware公司成立于1998年,2003年存储厂商EMC以6.35亿美元收购了VMware;2015年10月,戴尔宣布以670亿美元收购EMC。VMware公司在2018年全年收入79.2亿美元。 VMware主…...
leetcode刷题-代码训练营-第7章-回溯算法1
回溯法模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果} }理解 从…...
零依赖STL转STEP工具:5分钟实现3D格式无缝转换的完整指南
零依赖STL转STEP工具:5分钟实现3D格式无缝转换的完整指南 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 在数字化制造和工程设计的交叉领域,STL到STEP格式转换已成为连…...
Office RibbonX Editor:免费开源Office界面定制终极指南
Office RibbonX Editor:免费开源Office界面定制终极指南 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-edit…...
大语言模型智能体长期记忆解决方案:LightMem架构解析与LangChain实战
1. 项目概述:轻量化记忆增强的智能体新范式最近在探索大语言模型智能体应用时,一个核心痛点始终绕不开:如何让智能体在长对话或多轮任务中,记住关键信息,并做出连贯、精准的决策?传统的做法要么是将整个对话…...
JetBrains IDE试用重置终极指南:高效管理30天评估期
JetBrains IDE试用重置终极指南:高效管理30天评估期 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用重置工具(ide-eval-resetter)是一款专为IntelliJ IDEA、P…...
Boss-Key终极指南:Windows窗口隐藏与隐私保护完整解决方案
Boss-Key终极指南:Windows窗口隐藏与隐私保护完整解决方案 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在数字化办公环境中…...
基于CircuitPython与BLE的NeoPixel智能穿戴灯光项目实战
1. 项目概述:打造你的第一顶可编程发光帽 几年前,当我第一次在Maker Faire上看到有人戴着一顶能随着音乐节奏变换色彩的帽子时,我就被深深吸引了。那不仅仅是一个电子项目,更像是一件充满个性的可穿戴艺术品。从那时起࿰…...
树莓派Pico上使用Blinka兼容层调用CircuitPython传感器库
1. 项目概述与核心价值如果你手头有一块树莓派 Pico,正在用 MicroPython 开发,但眼馋 CircuitPython 生态里那海量且维护良好的传感器驱动库,比如 Adafruit 官方出品的那些,那么你肯定想过:能不能直接在 MicroPython 里…...
思源宋体TTF终极指南:7种字重解决中文排版所有难题
思源宋体TTF终极指南:7种字重解决中文排版所有难题 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是否在为中文项目寻找完美的开源字体而烦恼?商业字体价格昂…...
人生的本质的庖丁解牛
它的本质是:人生是一个 向死而生 (Being-towards-death) 的 耗散结构 (Dissipative Structure)。它在时间轴上从 低熵 (有序/出生) 滑向 高熵 (无序/死亡),期间通过 消耗能量 (资源/注意力) 来维持暂时的 负熵 (秩序/成长)。在这个过程中,个体…...
如何用LRCGET歌词下载神器一键解决数千首离线音乐歌词同步难题
如何用LRCGET歌词下载神器一键解决数千首离线音乐歌词同步难题 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 你是否拥有一个庞大的离线音乐库&#x…...
