多线程开发中List的使用

由于ArrayList在多线程高并发情况下是不安全的,因此要慎用,那么此时如果涉及到集合操作,应该怎么选:

方案一:Vector:

特点:通过给所有方法都用 synchronized 修饰从而保证线程安全,

缺点:CopyOnWriteArrayList

  • 高并发场景下性能较差(锁竞争严重)。

  • 即使单线程环境也会因同步开销影响性能。

总结:不建议使用。

方案二:Collections.synchronizedList

特点:低并发读写,简单封装 ArrayList,所有方法加锁。

缺点:高并必情况下性能不如CopyOnWriteArrayList

使用示例:

List<String> syncList = Collections.synchronizedList(new ArrayList<>());
// 复合操作仍需外部同步
synchronized (syncList) {if (!syncList.contains("value")) {syncList.add("value");}
}

方案三:CopyOnWriteArrayList

特点:

    1.读操作:无锁,直接访问底层数组;

            2.写操作:复制新数组,修改后替换旧数组(适合 读多写极少 的场景)。

缺点:

           1.写操作开销大(需复制数组)。

           2.数据一致性弱:读取的是某一时刻的快照,可能读到旧数据。

使用示例:

// 示例:事件监听器列表
private final List<Listener> listeners = new CopyOnWriteArrayList<>();

 拓展:

CopyOnwriteArrayList通过JUC包下的lock来实现线程间的同步的, 可实现了读读操作和读写操作不互斥。
它是怎么实现读写不互斥的呢?
在面临写操作的时候,CopyOnwriteArrayList会先复制原来的数组并且在新数组上进行修改,最后再将原数组覆盖。如果写操作过程中发生了线程切换。并且切换到读线程,因为此时数组并未发生覆盖,读操作读取的还是原数组。另外,数组定义private transient volatile Object[] array,其中采用volatile修饰,保证内存可见性,读取线程可以马上知道这个修改。也就是说当读写并发时读操作是在旧数组中读到的旧值(一致性弱)。

方案四:ConcurrentLinkedQueue

特点:

  1.高并发队列操作(如任务分发),基于 CAS 无锁实现。

      2.线程安全:多线程并发添加无需额外同步。

      3. 无阻塞:操作立即返回,不会因锁竞争导致线程挂起。

      4. 无容量限制:队列会动态扩展。

缺点

        1.不支持随机访问(非 List 接口实现)。

        2.弱一致性:迭代器创建后,其他线程的修改可能不会立即反映到遍历中。

        3.不支持 remove() 操作:尝试通过迭代器删除元素会抛出 UnsupportedOperationException

使用示例:

public class Main {public static void main(String[] args) {ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();// 添加元素(推荐使用 offer)queue.offer("A"); // 返回 true 表示成功queue.add("B");   // 与 offer 等效// 读取并移除头部元素String head1 = queue.poll(); // 返回 "A",队列变为 [B]System.out.println("Polled: " + head1);// 仅读取头部元素(不移除)String head2 = queue.peek(); // 返回 "B",队列仍为 [B]System.out.println("Peeked: " + head2);// 队列为空时queue.poll();               // 移除 "B",队列为空 []String head3 = queue.poll(); // 返回 nullSystem.out.println("Polled empty: " + head3);}
}

方案五:ConcurrentHashMap 

特点:可实现高性能随机访问,需要设置KEY.

方案对比:

开发推荐

现代开发中更推荐 CopyOnWriteArrayList

  • 无锁读取:适合多核 CPU 环境,避免线程阻塞。

  • 代码简洁:无需手动同步,减少错误。

  • 安全迭代:迭代器不会抛出 ConcurrentModificationException

但需注意其 内存占用(写时复制会占用双倍空间)。

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

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

相关文章

论文阅读笔记:Denoising Diffusion Implicit Models (2)

0、快速访问 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;1&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;2&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08…

人工智能在医疗领域的前沿应用与挑战

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活&#xff0c;其中医疗领域无疑是受益最为显著的行业之一。从疾病诊断、治疗方案制定到患者护理&#xff0c;AI的应用不仅提高了医疗服务的效率和质量&#xff0c;还为医…

【计算机网络】HTTP与HTTPS

文章目录 1. HTTP定义2. HTTP交互3. HTTP报文格式3.1 抓包工具-fiddler3.2 抓包操作3.3 报文格式3.3.1 请求报文3.3.2 响应报文 4. URL5. 请求头中的方法6. GET和POST的区别7. HTTP报头7.1 Host7.2 Content_Length7.3 Content_Type7.4 User-Agent(UA)7.5 Referer7.6 Cookie 8 状…

怎样提升大语言模型(LLM)回答准确率

怎样提升大语言模型(LLM)回答准确率 目录 怎样提升大语言模型(LLM)回答准确率激励与规范类知识关联类情感与语境类逆向思维类:为什么不,反面案例群体智慧类明确指令类示例引导类思维引导类约束限制类反馈交互类:对话激励与规范类 给予奖励暗示:在提示词中暗示模型如果回…

【分享】内外网文件摆渡系统:让数据传输更安全更可靠

【分享】Ftrans内外网文件摆渡系统&#xff1a;让数据传输更安全更可靠&#xff01; 随着大数据时代的到来&#xff0c;数据的重要性日渐得到重视&#xff0c;数据作为数字经济时代下的基础性资源和战略性资源&#xff0c;是决定国家经济发展水平和竞争力的核心驱动力。以行业…

Python自动化面试通关秘籍

Python自动化测试工程师面试&#xff0c;不仅仅是考察你的代码能力&#xff0c;更看重你如何在项目中灵活运用工具和框架解决实际问题。如果你正准备面试&#xff0c;这篇文章将为你总结最常见的高频考题及答题技巧&#xff0c;帮助你快速上手&#xff0c;通关面试&#xff0c;…

Logstash开启定时任务增量同步mysql数据到es的时区问题

本文使用修改时间modify_date作为增量同步检测字段&#xff0c;可检测新增和修改&#xff0c;检测不到删除&#xff0c;检测删除请使用canal查询binlog日志同步数据 检测修改时间字段为varchar的时候可以先创建索引&#xff0c;并设置对应的mapping为&#xff08;可以无视时区…

如何使用 FastAPI 构建 MCP 服务器

哎呀&#xff0c;各位算法界的小伙伴们&#xff01;今天咱们要聊聊一个超酷的话题——MCP 协议&#xff01;你可能已经听说了&#xff0c;Anthropic 推出了这个新玩意儿&#xff0c;目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。不过别担心&#xff0c;为你的…

【Git】-- 处理 Git 提交到错误分支的问题

如果你不小心把本应提交到 test 分支的代码提交到了 master 分支&#xff08;但尚未 push&#xff09;&#xff0c;可以按照以下步骤解决&#xff1a; 方法一&#xff08;推荐&#xff09;&#xff1a;使用 git reset 和 git stash 首先&#xff0c;确保你在 master 分支&…

通用目标检测技术选型分析报告--截止2025年4月

前言 本文撰写了一份关于通用目标检测&#xff08;General Object Detection&#xff09;的技术选型分析报告&#xff0c;覆盖2000至2025年技术演进历程&#xff0c;重点纳入YOLO-World、RT-DETR、Grounding DINO等2024-2025年的最新模型。 报告将包括技术定义、行业现状、技…

链路追踪Skywalking

一、什么是Skywalking 分布式链路追踪的一种方式&#xff1a;Spring Cloud SleuthZipKin&#xff0c;这种方案目前也是有很多企业在用&#xff0c;但是作为程序员要的追逐一些新奇的技术&#xff0c;Skywalking作为后起之秀也是值得大家去学习的。 Skywalking是一个优秀的国产…

websocket获取客服端真实ip

在websocket建立连接时,获取访问客户端的真实ip 1. websocket建立连接过程 2. pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>3. 添加配置,握…

NSSCTF(MISC)—[justCTF 2020]pdf

相应的做题地址&#xff1a;https://www.nssctf.cn/problem/920 binwalk分离 解压文件2AE59A.zip mutool 得到一张图片 B5F31内容 B5FFD内容 转换成图片 justCTF{BytesAreNotRealWakeUpSheeple}

部分国产服务器CPU及内存性能测试情况

近日对部分国产服务器进行了CPU和内存的性能测试&#xff0c; 服务器包括华锟振宇、新华三和中兴三家&#xff0c;CPU包括鲲鹏、海光和Intel&#xff0c;初步测试结果如下&#xff1a; 服务器厂商四川华锟振宇新华三中兴中兴服务器HuaKun TG225 B1R4930 G5R5930 G2R5300 G4操作…

【无标题】Scala函数基础

函数和方法的区别 1&#xff09; 核心概念 &#xff08;1&#xff09; 为完成某一功能的程序语句的集合&#xff0c;称为函数。 &#xff08;2&#xff09; 类中的函数称之方法。 2&#xff09; 案例实操 &#xff08;1&#xff09; Scala 语言可以在任何的语法结构中声明…

uniapp -- 列表垂直方向拖拽drag组件

背景 需要在小程序中实现拖拽排序功能,所以就用到了m-drag拖拽组件,在开发的过程中,发现该组件在特殊的场景下会有些问题,并对其进行了拓展。 效果 组件代码 <template><!-- 创建一个垂直滚动视图,类名为m-drag --><scroll

conda安装python 遇到 pip is configured with locations that require TLS/SSL问题本质解决方案

以前写了一篇文章&#xff0c;不过不是专门为了解决这个问题的&#xff0c;但是不能访问pip install 不能安装来自https 协议的包问题几乎每次都出现&#xff0c;之前解决方案只是治标不治本 https://blog.csdn.net/wangsenling/article/details/130194456​​​​​​​https…

【初阶数据结构】队列

文章目录 目录 一、概念与结构 二、队列的实现 队列的定义 1.初始化 2.入队列 3.判断队列是否为空 4.出队列 5.取队头数据 6.取队尾数据 7.队列有效个数 8.销毁队列 三.完整源码 总结 一、概念与结构 概念&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除…

Apache Shiro 全面指南:从入门到高级应用

一、Shiro 概述与核心架构 1.1 什么是 Shiro&#xff1f; Apache Shiro 是一个强大且易用的 Java 安全框架&#xff0c;它提供了认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、加密&#xff08;Cryptography&#xff09;和会话管…

es 3期 第28节-深入掌握集群组建与集群设置

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…