线程安全的集合类

devtools/2025/6/21 16:36:27/

目录

多线程下使用ArrayList

1.⾃⼰使⽤同步机制 (synchronized 或者 ReentrantLock)自行加锁(推荐)

2.使用Collections.synchronizedList(new ArrayList);

3.使⽤ CopyOnWriteArrayList

多线程使用哈希表

ConcurrentHashMap

ConcurrentHashMap核心优化点


多线程下使用ArrayList
1.⾃⼰使⽤同步机制 (synchronized 或者 ReentrantLock)自行加锁(推荐)

分析清楚,要把哪些代码打包到一起,成为一个“原子”操作

2.使用Collections.synchronizedList(new ArrayList);

返回list的各种关键方法都是带有synchronized

3.使⽤ CopyOnWriteArrayList

不去加锁,编程中的一些常见的思想方法

写时拷贝

修改不同变量/读取

多线程读取

确保读取过程中,要么读到的是旧版数据,要么读到的是新版数据

不会读到“修改”一半的数据

这个过程没有加锁,不会产生阻塞

但是很明显上述方案也有缺点

1.数组特别大,非常低效

2.如果多个线程同时修改也容易出问题

适合于特定场景的方案

服务器进行重新加载配置的时候

很多程序提供很多功能,按需开启/按需设置

服务器正在运行,但是需要修改配置

很多服务器也会提供配置重加载reload

配置就是被读取到服务器的内存中,以数组/哈希存储

服务器代码中的其他逻辑就会读取这些数组/哈希中的值,不会修改

此时,程序员手动修改配置文件后,手动触发reload功能

服务器就会创建新的数组/哈希,加载新的配置

加载完毕,使用新配置代替旧配置


多线程使用哈希表

HashMap线程不安全

Hashtable线程安全的(给各种public方法都加synchronized)

ConcurrentHashMap

效率更高,按照桶级别进行加锁,而不是给整个哈希加一个全局锁,有效降低锁冲突的概率

如果修改的两个元素,在不同链表上,本身就不涉及线程安全问题(修改不同变量)

如果修改同一个链表上的两个元素,可能就有线程安全问题,比如把这俩元素插入同一元素后面就可能产生竞争

针对不同的锁对象加锁,不会产生锁竞争(不会阻塞)

直接使用每个链表的头结点作为synchronized的锁对象

锁开销最大的地方就是阻塞

实际开发中用到的hash表可能是比较大的,桶有很多很多个

即使多线程访问上述的哈希表,同一时刻两个线程恰好访问同一个链表的可能性概率就比较第

ConcurrentHashMap核心优化点

1.把锁整个表=》锁头桶

2.使用原子类针对size进行维护

3.针对哈希扩容的场景

化整为零

确保每个操作的加锁时间不要太长

扩容操作意味着需要创建更大的数组

把旧哈希中的所有元素搬运到新的哈希中(元素很多,耗时很长)

一口气进行所有的搬运比较耗时

把整个搬运拆成多次来完成


http://www.ppmy.cn/devtools/130327.html

相关文章

在Windows 10上安装Tesseract并用pytesseract运行OCR任务

诸神缄默不语-个人CSDN博文目录 文章目录 1. Tesseract安装2. pytesseract的安装与使用3. 手动安装其他语种并在pytesseract中调用4. 本文撰写过程中参考的其他网络资料 1. Tesseract安装 Tesseract官方GitHub项目链接:https://github.com/tesseract-ocr/tesseract…

Redis 目录

《Redis & 基础 & 源码》《Redis & 基础 & 总结》《Redis & 基础 & 问题》《Redis & 实战 & 源码》《Redis & 实战 & 总结》《Redis & 实战 & 问题》《Redis & 过期策略 & 源码》《Redis & 过期策略 & 总结》…

十分钟Linux中的epoll机制

epoll机制 epoll是Linux内核提供的一种高效I/O事件通知机制,用于处理大量文件描述符的I/O操作。它适合高并发场景,如网络服务器、实时数据处理等,是select和poll的高效替代方案。 1. epoll的工作原理 epoll通过内核中的事件通知接口和文件…

SpringBoot精准扶贫系统:数据驱动的扶贫

3系统分析 3.1可行性分析 通过对本精准扶贫管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本精准扶贫管理系统采用SSM框架,JAVA作为开发语…

iDP3复现代码运行逻辑全流程(一)——部署全流程代码逻辑梳理(Learning)

Improved 3D Diffusion Policy (iDP3) 是一种新的基于3D视觉的运动策略,使用了以自我为中心的3D视觉表征,实现了人形机器人在不同场景中自主执行技能 代码开源了两部分:Learning & Deployment of iDP3 和 Humanoid Teleoperation 本文详…

【数据库设计】规范设计理论之数据依赖的公理系统(1)

知道范式的几种分类之后还并不能帮助我们设计一款好的数据库,在对关系进行拆解(指模式分解)之前,我们需要引入一个理论基础让设计过程变得有迹可循和具备一定的严谨性以此来支撑数据库背后的可靠性。 Armstrong公理系统 所谓公理…

【ONE·Linux || 高级IO(二)】

总言 主要内容:多路转接:epoll学习。       文章目录 总言5、多路转接:epoll5.1、相关概念与接口5.1.1、基本函数认识5.1.1.1、epoll_create5.1.1.2、epoll_ctl5.1.1.3、epoll_wait 5.1.2、epoll的工作原理5.1.2.1、准备工作(…

心觉:如何让AI与你同频,帮助你光速成长

Hi,我是心觉,带你用潜意识化解各种焦虑、内耗,建立无敌自信;教你财富精准显化的实操方法;关注我,伴你一路成长! 每日一省写作215/1000天 现在的AI真的很强大 每个人都应该学会用AI 用AI是让你最快达到教…