线程安全的集合类

Java中提供了许多集合类,其中有的是线程安全的,有的是线程不安全的。线程安全的集合类有:

1. Vector:Vector类实现了一个动态数组,与ArrayList相似,但Vector是同步访问的

2. Stack:Stack是Vector的一个子类,实现了一个“后进先出”的栈

3. Hashtable:Hashtable是一个散列表,与HashMap类似

Hashtable在关键方法上加上了synchronized,相当于对this加锁(整张表都加上锁),则Hashtable只有一把锁,即使是修改或读取不同链表上的元素,也会触发锁冲突

通过上图我们可以发现:读取数据时不涉及到线程安全问题,修改两个不同链表上的元素时,也不会涉及线程安全问题,而当修改的是同一链表上的元素时,则可能会涉及到线程安全问题。

因此,针对读取操作,无需加锁,不同链表的操作,也无需加锁,而当针对同一链表操作时,需要加锁,此时,我们可以考虑使用ConcurrentHashMap

4. ConcurrentHashMap:ConcurrentHashMap能够做到读数据不加锁,且在进行写操作时锁的粒度更小,可以允许多个修改操作并发进行,Java 1.7及其之前,ConcurrentHashMap是通过“分段锁”来实现的,即给若干链表分配一把锁,然而这种方法需要引入额外的空间开销,且实现更复杂

因此,从Java 8 开始,就变成了每个链表一把锁了

此时,若不是操作同一个链表的锁,就不会发生锁冲突

然而此种方法是否需要更多的空间?

不会产生更多的空间代价。Java中任意一个对象都可以直接作为锁对象。哈希表中本就需要有数组,数组的元素都是已经存在的(每个链表的头节点),此时,只需使用链表的头节点(数组元素)作为锁对象即可

且ConcurrentHashMap针对扩容也进行了优化。

Hashtable一旦触发扩容,就由该线程完成整个扩容操作,此时可能会涉及到大量的元素拷贝,因此效率会较低,耗时较长

而ConcurrentHashMap则是采用“化整为零”的方法,即当发现需要扩容时,创建一个新的数组,同时搬运几个元素过去,后续每次线程操作ConcurrentHashMap时,都会搬运元素,每次操作搬运一部分元素。在此扩容期间,新旧数组同时存在。当搬运完最后一个元素时,再把旧数组删掉。在此期间内,插入数据只会向新数组中插入,而查找需要同时查询新数组和旧数组

5. synchronizedList:synchronizedList是标准库中提供的一个基于sychronized进行线程同步的list。synchronizedList的关键操作上都带有synchronized

6. CopyOnWriteArrayList:CopyOnWrite即写时拷贝,当读取顺序表时,此时无线程安全问题,而当有线程要修改其中的值时,就会将list复制一份,修改新表中的内容,并修改引用的指向(操作是原子的,无需加锁)

 然而因此此种操作需要进行复制,因此修改操作不能太频繁且表也不应太大

除此之外,也可以根据需求,使用synchronized或ReentrantLock自己实现线程安全的ArrayList

7. BlockingQueue(阻塞队列)

ArrayBlockingQueue:基于数组实现的阻塞队列

LinkedBlockingQueue:基于链表实现的阻塞队列

PriorityBlockingQueue:基于堆实现的带有优先级的阻塞队列

...

虽然以上这些类都是线程安全的,但也不一定能够满足我们多线程操作的需求,因此我们需要根据实际情况选择使用或自己加以实现

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

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

相关文章

血糖仪定制_基于联发科MT6761平台的血糖尿酸检测仪解决方案

高尿酸血症和糖尿病患者的发病都受到遗传因素和相同的饮食习惯的影响;高尿酸血症患者往往也是糖尿病的高发人群。糖尿病患者常常伴有肥胖、胰岛素抵抗等症状,这些都会影响尿酸的代谢。因此,在预防高尿酸的同时也需要预防高血糖的发生。 为了方便高尿酸人…

Unity关于纹理图片格式带来的内存问题和对预制体批量格式和大小减半处理

我们经常会遇到内存问题,这次就是遇到很多图片的默认格式被改成了RGB32,导致Android打包后运行内存明显增加。 发生了什么 打包Android后,发现经常崩溃,明显内存可能除了问题,看了内存后发现了问题。 见下图&#xf…

使用composer生成的DMG和PKG格式软件包有何区别

在使用Composer从包源构建软件包时候,有两种不同类型的包:PKG和DMG。你知道两者之间的区别吗? 以及如何选取吗? 每种格式都有各自的优势具体取决于软件包的预期用途以及用于部署软件包的工具。下面我们来了解一下PKG和DMG格式的区别和用途。…

Puppeteer让你网页操作更简单(1)屏幕截图

网页自动化设计爬虫工具 中就使用了Puppeteer进行对网页自动化处理,今天就来看看它是什么东西! 我们将学习什么? 在本教程中,您将学习如何使用JavaScript自动化和抓取 web。 为此,我们将使用Puppeteer。 Puppeteer是一个Node库API,允许我们控制无头Ch…

STM32项目设计:人脸识别门禁系统

文章目录 项目简介硬件设计 项目视频链接:【还在制作中,制作好会发在哔哩哔哩:化作尘my,记得先关注】 项目实物链接:【可以看看某鱼:化作尘my】 有需要可以购买一个实物,会提供相应的参考资料学…

CNAS认可是什么?湖南长沙CNAS专业第三方软件检测机构有哪些?

CNAS是中国合格评定国家认可委员会(China National Accreditation Service for Conformity Assessment)的缩写,是专门负责评定和认可各类检验机构、实验室、认证机构和校验机构的国家认可机构。CNAS认可的好处在于,它证明了软件企业和软件产品具备严格的…

k8s集群环境搭建以及插件安装

前置条件 终端工具MobaXterm很好用。 1、虚拟机三台(ip按自己的网络环境相应配置)(master/node) 节点ipk8s-master192.168.200.150k8s-node1192.168.200.151k8s-node2192.168.200.152 2、关闭防火墙(master/node) systemctl stop firewalld systemc…

在 Windows 11 上通过 Autoawq 启动 Mixtral 8*7B 大语言模型

在 Windows 11 上通过 Autoawq 启动 Mixtral 8*7B 大语言模型 0. 背景1. 安装依赖2. 开发 main.py3. 运行 main.py 0. 背景 看了一些文章之后,今天尝试在 Windows 11 上通过 Autoawq 启动 Mixtral 8*7B 大语言模型。 1. 安装依赖 pip install torch torchvision …

django后台手机号加密存储

需求: 1 :员工在填写用户的手机号时,直接填写,在django后台中输入 2:当员工在后台确认要存储到数据库时,后台将会把手机号进行加密存储,当数据库被黑之后,手机号字段为加密字符 3&am…

【时间复杂度】时间复杂度优化法则简讲

一、引言 时间复杂度是衡量算法运行效率的一项重要指标,它描述了随着输入规模的增加,算法的执行时间如何增长。在算法设计与分析中,我们经常面临着优化时间复杂度的任务,以便提高程序的性能。本博客将深入探讨时间复杂度的优化法…

PXE批量高效网络装机

总结 1实验流程只能抄老师,记忆浅 2排错能力几乎无 3 指令用的太死, 一 系统装机的三种引导方式 启动 操作 系统 1.硬盘 2.光驱(u盘) 3.网络启动 pxe 重装系统? 在已有操作系统 新到货了一台服务器&#xff…

[go语言]输入输出

目录 知识结构 输入 1.Scan ​编辑 2.Scanf 3.Scanln 4.os.Stdin --标准输入,从键盘输入 输出 1.Print 2.Printf 3.Println 知识结构 输入 为了展示集中输入的区别,将直接进行代码演示。 三者区别的结论:Scanf格式化输入&#x…

【linux】linux系统安装与更新软件

前言 linux系统安装软件有许多的方式,本文列举的是类似于windows从应用商店安装软件的方法。也是最常用最省事的方法。 但是呢linux系统是有许多发行版本的,不同版本的命令不同,但语法基本是一模一样。 概念插入 windows系统中&#xff0c…

【备战蓝桥杯】——Day1

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-xKn7nmq36s9pgUXR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

如何在Linux运行RStudio Server并实现Web浏览器远程访问

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” 文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. …

【汇编】 13.3 对int iret和栈的深入理解

书中示例 assume cs:codecode segment start:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset end0-offset lpcldrep movsb ;lp到end0的指令传送到0:200处mov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*42],0 ;设置7c表项…

YOLOv8在NX上的tensorrt的加速部署(60帧率)

所需环境 所有过程均可以参考本人所写的文章 (1)虚拟环境工具 MInforge3-Linux-aarch64 Jetson 平台都是RAM架构,平常的conda都是基于X86架构平台的。环境搭建参考文章 (2)YOLOv8_ros代码,采用自己创建的yolov_ros代码。yolov8_ros参考文章 (3)jetpack 环境(本篇文章…

Tomcat10.X部署老版本axis2 webservice项目不生效

目录 一、使用场景 二、问题描述 三、原因排查 四、解决方案 一、使用场景 原来项目是OpenJDK8tomcat9构建,现在需要升级到OpenJDK17tomcat10的组合。原来的webservice项目打包成aar格式,通过axis2部署在tomcat上。 二、问题描述 在配置好jdk和to…

vue3 知识

vue3介绍 Vue3的变化: 1、vue3完全兼容vue2,但是vue3不建议用vue2的写法 2、拥抱TypeScript,ts完全兼容js 3、组合式API和配置项API vue2 是配置项api vue3 组合式api vue3项目创建和启动 # 创建vue3项目&a…

STM32存储左右互搏 SPI总线FATS读写FRAM MB85RS2M

STM32存储左右互搏 SPI总线FATS读写FRAM MB85RS2M 在中低容量存储领域,除了FLASH的使用,,还有铁电存储器FRAM的使用,相对于FLASH,FRAM写操作时不需要预擦除,所以执行写操作时可以达到更高的速度&#xff0…