List的线程安全

article/2025/8/24 12:49:34

List的线程安全

  • 背景
  • 实验
    • 1. ArrayList
    • 2. synchronizedList
    • 3. 运行抛出异常
      • ArrayIndexOutOfBoundsException异常原因

背景

Q:今天遇到一个场景,我们业务需要使用批量的数据进行操作,但是别人的接口只支持一个一个的查,所以需要用多线程去查结果值组装成一个list再进行后期的业务逻辑实现。

实验

用哪个list呢?写了一个小demo

1. ArrayList

使用我们平常经常用的ArrayList进行测试

public class SetThread implements Runnable {private List<Long> indeLong;public SetThread(List<Long> indeLong) {this.indeLong = indeLong;}@Overridepublic void run() {for (int i = 0; i < 50000; i++) {indeLong.add(Long.valueOf(i));}}
}public class MyMain {public static void main(String[] args) throws InterruptedException {// 初始化一个数组List<Long> sycList = new ArrayList<>(200000);SetThread setRunnable1 = new SetThread(sycList);Thread thread1 = new Thread(setRunnable1);SetThread setRunnable2 = new SetThread(sycList);Thread thread2 = new Thread(setRunnable2);SetThread setRunnable3 = new SetThread(sycList);Thread thread3 = new Thread(setRunnable3);SetThread setRunnable5 = new SetThread(sycList);Thread thread5 = new Thread(setRunnable5);thread1.start();thread2.start();thread3.start();thread5.start();thread1.join();      // 主线程等待子线程执行完毕thread2.join();thread3.join();thread5.join();System.out.println(sycList.size());}
}

但是返回的结果值不是我们预期的200000个
在这里插入图片描述

2. synchronizedList

再次使用线程安全的synchronizedList测试

public class MyMain {public static void main(String[] args) throws InterruptedException {// 初始化一个数组List<Long> originList = new ArrayList<>();List<Long> sycList = Collections.synchronizedList(originList);SetThread setRunnable1 = new SetThread(sycList);Thread thread1 = new Thread(setRunnable1);SetThread setRunnable2 = new SetThread(sycList);Thread thread2 = new Thread(setRunnable2);SetThread setRunnable3 = new SetThread(sycList);Thread thread3 = new Thread(setRunnable3);SetThread setRunnable5 = new SetThread(sycList);Thread thread5 = new Thread(setRunnable5);thread1.start();thread2.start();thread3.start();thread5.start();thread1.join();      // 主线程等待子线程执行完毕thread2.join();thread3.join();thread5.join();System.out.println(sycList.size());}
}

使用线程安全的List之后每次执行都是准确返回200000个
在这里插入图片描述

3. 运行抛出异常

中间还有个小插曲,使用ArrayList进行操作不设置最开始的initialCapacity值的测试

public class MyMain {public static void main(String[] args) throws InterruptedException {// 初始化一个数组(不设置数组长度)List<Long> sycList = new ArrayList<>();SetThread setRunnable1 = new SetThread(sycList);Thread thread1 = new Thread(setRunnable1);SetThread setRunnable2 = new SetThread(sycList);Thread thread2 = new Thread(setRunnable2);SetThread setRunnable3 = new SetThread(sycList);Thread thread3 = new Thread(setRunnable3);SetThread setRunnable5 = new SetThread(sycList);Thread thread5 = new Thread(setRunnable5);thread1.start();thread2.start();thread3.start();thread5.start();thread1.join();      // 主线程等待子线程执行完毕thread2.join();thread3.join();thread5.join();System.out.println(sycList.size());}
}

抛出了异常:
在这里插入图片描述

ArrayIndexOutOfBoundsException异常原因


http://chatgpt.dhexx.cn/article/WRjqw6JH.shtml

相关文章

线程安全 List 效率测试

List 常见类以及各自优缺点可自行参考 https://blog.csdn.net/weixin_39883065/article/details/111197724 本机环境 java 版本&#xff1a;1.8.0_161 window 信息&#xff1a; 测试代码 下面通过代码测试 List 线程安全类 Vector、Collections.synchronizedList(List lis…

三种线程安全的List

在单线程开发环境中&#xff0c;我们经常使用ArrayList作容器来存储我们的数据&#xff0c;但它不是线程安全的&#xff0c;在多线程环境中使用它可能会出现意想不到的结果。 多线程中的ArrayList&#xff1a; 我们可以从一段代码了解并发环境下使用ArrayList的情况&#xff…

线程安全的List

线程安全的List Vector类的架构基本属性构造方法基本方法 SynchronizedList和SynchronizedRandomAccessListCollections.synchronizedList构造方法具体方法具体使用 CopyOnWriteArrayList(**)简介结构成员变量常见方法add (***)removeget CopyOnWriteArrayList总结 总结 在我们…

Git - 拉取远程分支并创建本地分支

一、查看远程分支 使用如下git命令查看所有远程分支 git branch -r 查看远程和本地所有分支 git branch -a 查看本地分支 git branch 在输出结果中&#xff0c;前面带* 的是当前分支 二、拉取远程分支并创建本地分支 方法一 使用如下命令 git checkout -b 本地分支名…

Git获取远程分支文件并创建自己的远程分支

Git获取远程分支文件并创建自己的远程分支 1、前期准备软件&#xff1a;git-bash 2、获取远程分支文件过程 创建一个空的文件夹&#xff0c;选择文件夹&#xff0c;并右击&#xff0c;选择该选项打开命令行。 复制需要拉取的远程仓库地址。 &#xff08;2&#xff09;把maste…

git基于远程分支创建本地分支

git基于远程分支创建本地分支 1.首先 git branch -a 查看所有的分支 2.使用 git checkout -b 本地分支名 远程分支名 https://blog.csdn.net/north1989/article/details/116299912?utm_mediumdistribute.pc_relevant.none-task-blog-baidujs_baidulandingword-0&spm1001.…

git 创建本地分支及远程分支并且关联分支

git命令在创建本地分支及远程分支并且关联远程分支 为了便于版本的维护及管理将会不断的在master分支上创建出新的分支 大致分为: 首先切换到在要开的分支上――――>创建本地分支――――>创建远程分支――――>切换到本地分支――――>将本地分支与远程分支关联…

git 创建远程分支,并提交代码到该分支的操作

1. 首先&#xff0c;在本地创建这个分支 使用命令 git checkout -b 分支名 &#xff08;表示创建这个分支&#xff0c;并且切换到该分支&#xff09; 2. 创建远程分支 使用命令 git push --set-upstream origin 分支名 &#xff08;表示将分支推送到远程仓库&#xff09; 3. …

git创建远程分支并关联本地分支

场景一&#xff1a; 本地、远程都没有分支 "v1.0.0" 1. 先查看确认一下&#xff0c;命令&#xff1a; git branch -a 2. 创建本地分支&#xff0c;命令&#xff1a; git checkout -b v1.0.0 3. 创建远程分支&#xff0c;并且本地分支关联远程分支&#xff0c;命令…

Git 创建远程分支并提交代码到远程分支

1、可以通过git branch -r 命令查看远端库的分支情况 2、从已有的分支创建新的分支(如从master分支),创建一个dev分支 但此时并没有在远程仓库上创建分支 如图所示 还是只有一个master分支 3、建立本地到远端仓库的链接 --这样代码才能提交上去 使用命令行 git push --set-…

Git创建远程分支并提交代码到远程分支

1、可以通过git branch -r 命令查看远端库的分支情况 动图演示&#xff08;选择项目右键选择 Git Bash Here&#xff0c;然后输入命令git branch -r&#xff09;&#xff1a; 2、从已有的分支创建新的分支(如从master分支),创建一个dev分支 但此时并没有在远程仓库上创建分支 如…

机器学习知识经验分享之三:基于卷积神经网络的经典目标检测算法

文章目录 前言一、一阶段目标检测算法1.YOLO系列算法2.SSD检测算法3. RetinaNet检测算法 二、两阶段目标检测算法1.Faster R-CNN检测算法2.Mask R-CNN检测算法3.Cascade R-CNN检测算法 总结 前言 本系列文章将对机器学习知识进行分享总结。便于大家从理论层面了解人工智能基础…

轻量型目标检测算法一次看个够

序言 不知道大家有没有发现&#xff0c;近两年目标检测算法发展非常的快&#xff0c;恍惚一看&#xff0c;单阶段算法几乎统一了目标检测&#xff0c;各种高性能的目标检测算法层出不穷&#xff0c;印象中是在YOLOv4出来后&#xff0c;基于YOLO的改进变得一发不可收拾&#xf…

万字长文概述单目3D目标检测算法

一&#xff0c;理论基础-相机与图像 相机将三维世界中的坐标点&#xff08;单位为米&#xff09;映射到二维图像平面&#xff08;单位为像素&#xff09;的过程能够用一个几何模型进行描述&#xff0c;这个模型有很多种&#xff0c;其中最简单的称为针孔相机模型。相机的成像过…

yolov5 目标检测算法

简介&#xff1a; 目标检测在生活中应用领域非常广泛&#xff0c;列如&#xff1a;道路违规抓拍、未戴口罩识别、工地未佩戴安全帽抓拍、厨房出现老鼠检测。 还可以用在游戏辅助外挂。以枪战为例&#xff0c;在游戏过程中时刻检测有没有人头出现。当检测到目标人头&#xff0c;…

【快速入门】YOLOv5目标检测算法

文章目录 一、YOLOv5简介二、网络结构1、Input2、Backbone3、Neck4、Head 三、改进方法1、自适应锚框计算2、自适应灰度填充 四、性能表现五、YOLOv5入门实战 一、YOLOv5简介 YOLOv5是一个在COCO数据集上预训练的物体检测架构和模型系列&#xff0c;它代表了Ultralytics对未来…

目标检测算法汇集介绍

目标检测算法 目标检测概念 目标检测这里阐述两个应用场景&#xff0c;1 为物体位置检测&#xff0c;2 为物体关键点检测。 1 物体位置检测 相比与图片分类&#xff0c;目标检测算法结果要求不仅识别出图片中的物理类别并且输出物体的位置参数。 物体的位置通过bounding bo…

YOLOv3目标检测算法——通俗易懂的解析

目录 YOLOv3目标检测算法前沿一.YOLOv3二.损失函数 YOLOv3目标检测算法 前沿 前两篇文章我们讲了下关于YOLOv1和YOLOv2的原理&#xff0c;有不懂的小伙伴可以回到前面再看看&#xff1a; YOLOv1目标检测算法——通俗易懂的解析YOLOv2目标检测算法——通俗易懂的解析 作者出于…

单阶段目标检测算法之YOLOv1详解

官方网站C语言版本:https://pjreddie.com/darknet/yolov1/ tensorflow版本的代码下载&#xff1a; https://github.com/hizhangp/yolo_tensorflow 论文&#xff1a; http://arxiv.org/abs/1506.02640 目录 一、YOLO介绍 二、YOLOv1的结构 三、YOLOV1原理 &#xff08;一…

yolo-目标检测算法简介

一 简单概念 机器视觉的四大任务 分类-Classification&#xff1a;解决“是什么&#xff1f;”的问题&#xff0c;即给定一张图片或一段视频判断里面包含什么类别的目标. 检测-Detection&#xff1a;解决“是什么&#xff1f;在哪里&#xff1f;”的问题&#xff0c;即定位出…