并发容器介绍(一)

并发容器介绍(一)

文章目录

  • 并发容器介绍(一)
    • ConcurrentHashMap
    • CopyOnWriteArrayList
    • ConcurrentLinkedQueue

文章来自Java Guide 用于学习如有侵权,立即删除

ConcurrentHashMap

我们知道 HashMap 不是线程安全的,在并发场景下如果要保证一种可行的方式是使用 Collections.synchronizedMap() 方法来包装我们的 HashMap。但这是通过使用一个全局的锁来同步不同线程间的并发访问,因此会带来不可忽视的性能问题。

所以就有了 HashMap 的线程安全版本—— ConcurrentHashMap 的诞生。

在 JDK1.7 的时候,ConcurrentHashMap 对整个桶数组进行了分割分段(Segment,分段锁),每一把锁只锁容器其中一部分数据(下面有示意图),多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。

到了 JDK1.8 的时候,ConcurrentHashMap 已经摒弃了 Segment 的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。(JDK1.6 以后 synchronized 锁做了很多优化) 整个看起来就像是优化过且线程安全的 HashMap,虽然在 JDK1.8 中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本。

关于 ConcurrentHashMap 的详细介绍,请看我写的这篇文章:ConcurrentHashMap 源码分析。

CopyOnWriteArrayList

在 JDK1.5 之前,如果想要使用并发安全的 List 只能选择 Vector。而 Vector 是一种老旧的集合,已经被淘汰。Vector 对于增删改查等方法基本都加了 synchronized,这种方式虽然能够保证同步,但这相当于对整个 Vector 加上了一把大锁,使得每个方法执行的时候都要去获得锁,导致性能非常低下。

JDK1.5 引入了 Java.util.concurrent(JUC)包,其中提供了很多线程安全且并发性能良好的容器,其中唯一的线程安全 List 实现就是 CopyOnWriteArrayList

对于大部分业务场景来说,读取操作往往是远大于写入操作的。由于读取操作不会对原有数据进行修改,因此,对于每次读取都进行加锁其实是一种资源浪费。相比之下,我们应该允许多个线程同时访问 List 的内部数据,毕竟对于读取操作来说是安全的。

这种思路与 ReentrantReadWriteLock 读写锁的设计思想非常类似,即读读不互斥、读写互斥、写写互斥(只有读读不互斥)。CopyOnWriteArrayList 更进一步地实现了这一思想。为了将读操作性能发挥到极致,CopyOnWriteArrayList 中的读取操作是完全无需加锁的。更加厉害的是,写入操作也不会阻塞读取操作,只有写写才会互斥。这样一来,读操作的性能就可以大幅度提升。

CopyOnWriteArrayList 线程安全的核心在于其采用了 写时复制(Copy-On-Write) 的策略,从 CopyOnWriteArrayList 的名字就能看出了。

当需要修改( addsetremove 等操作) CopyOnWriteArrayList 的内容时,不会直接修改原数组,而是会先创建底层数组的副本,对副本数组进行修改,修改完之后再将修改后的数组赋值回去,这样就可以保证写操作不会影响读操作了。

关于 CopyOnWriteArrayList 的详细介绍,请看我写的这篇文章:CopyOnWriteArrayList 源码分析。

ConcurrentLinkedQueue

Java 提供的线程安全的 Queue 可以分为阻塞队列非阻塞队列,其中阻塞队列的典型例子是 BlockingQueue,非阻塞队列的典型例子是 ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 阻塞队列可以通过加锁来实现,非阻塞队列可以通过 CAS 操作实现。

从名字可以看出,ConcurrentLinkedQueue这个队列使用链表作为其数据结构.ConcurrentLinkedQueue 应该算是在高并发环境中性能最好的队列了。它之所有能有很好的性能,是因为其内部复杂的实现。

ConcurrentLinkedQueue 内部代码我们就不分析了,大家知道 ConcurrentLinkedQueue 主要使用 CAS 非阻塞算法来实现线程安全就好了。

ConcurrentLinkedQueue 适合在对性能要求相对较高,同时对队列的读写存在多个线程同时进行的场景,即如果对队列加锁的成本较高则适合使用无锁的 ConcurrentLinkedQueue 来替代。

大家好,我是xwhking,一名技术爱好者,目前正在全力学习 Java,前端也会一点,如果你有任何疑问请你评论,或者可以加我QQ(2837468248)说明来意!希望能够与你共同进步

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

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

相关文章

C语言学习-day19-函数2

自定义函数:自己定义的函数 以strcpy为例子: 自定义函数一样,需要函数名,返回值类型,函数参数。 函数的组成: ret_type fun_name(para1, *) { statement;//语句项 } ret_type 返回类型 fun_name 函数…

weiphp5.0存在远程代码执行漏洞

@[toc] 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. weiphp5.0简介 微信公众号搜索:南风漏洞复…

通过pidin观察线程信息

通过pidin观察线程信息 pidin在qnx里是一个非常有用的命令,该命令提供了多个选项来获取关于进程的详细信息,包括进程ID(PID)、进程状态、CPU使用情况、内存使用情况、线程信息等。 pidin通过threads参数可以观察进程ID&#xff…

在并发场景如何正确的使用锁机制呢?

Java提供了多种锁机制来保证线程安全,包括synchronized关键字、Lock接口、ReadWriteLock接口等等。在日常并发场景中,正确使用锁机制是非常重要的,因为不恰当的锁使用会导致死锁、饥饿等问题,影响程序的性能和可靠性。 首先&…

c++ 开发环境 LNK1104: 无法打开文件“carve.lib” 已解决

别人分享, 和自己最近遇到问题一摸一样。以为没什么用的静态资源,结果 无法编译。 昨天安装配置了,结果今天早上打开电脑,所以dll的工程全部报错: 1>------ 已启动全部重新生成: 项目: Dll_test, 配置: Debug x64…

[Python]`threading.local`创建线程本地数据

在Python中,threading.local是一个用于创建线程本地数据的工具。它允许每个线程拥有自己独立的变量副本,这样可以在多线程程序中避免共享变量带来的问题。 通过使用threading.local,你可以为每个线程创建一个独立的变量空间,这样…

2024.02.09 校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、校招 | 中国电信江苏分公司2024年春季校园招聘 校招 | 中国电信江苏分公司2024年春季校园招聘 2、校招 | 国机集团2024届总部管培生春季招聘全面启动! 校招 | 国机集团202…

pycharm中连接远程服务器

文章目录 概要文件进行映射将本地的project和远程的project进行映射,一定要使用sftp本地文件和远程的位置配置不想将远程的文件同步时候,可以进行下面设置 配置远程服务器的python解释器需要setting-->python interpreter-->add---> on ssh选择…

《Vue3 基础知识》事件总线 bus(与Vue2 有差异,使用 mitt 库)

前言 Vue2 与 Vue3 事件总线区别 Vue2 使用 $on,$off 和 $once 实例方法,创建一个事件总线,可在整个应用中做全局事件监听;Vue3 移除 $on,$off 和 $once 实例方法 ,但提供了解决方案,使用库 m…

crossover玩不了qq游戏大厅怎么办 仍有五亿人坚持用QQ crossover玩游戏 Mac电脑玩QQ游戏

从1999年2月,QQ首个版本QICQ(OPEN-ICQ)上线。到2024年,靠着5亿月活用户,守住社交领域TOP2位置。你还记得QQ经典的铃声吗? 根据月狐数据2023年12月的统计,QQ月活跃账户数比微博和知乎加在一起还要…

分享10个ai人工智能ppt生成软件,一键轻松搞定PPT制作!

ai 人工智能发展至今,已经诞生了各式各样的 AI 软件,最常见的如 AI 写作软件、AI 绘画软件、AI 人工智能 ppt 生成器、AI 人工智能抠图软件等等。对每天要面对各类文档、演示文稿(PPT)的职场人来说,最被需要的 AI 软件…

颜色检测python项目

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 什么是颜色检测? 颜色检测是检测任何颜色名称的过程。很简单不是吗?嗯,对于人类来说,这是一项极…

教你怎么写苹果群控系统!

在数字化时代,随着智能手机的普及和iOS系统的广泛应用,苹果设备的管理和控制变得日益重要,为了满足这一需求,苹果群控系统应运而生。 一、系统概述 苹果群控系统是一种能够对多台苹果设备进行集中管理和控制的软件系统。通过该系…

2024年会声会影 迎接来了七大新功能

我喜欢Corel VideoStudio 会声会影2024旗舰版,因为它使用起来很有趣。它很容易使用,但仍然给你很多功能和力量。VideoStudio让我与世界分享我的想法!“这个产品的功能非常多,我几乎没有触及它的表面,我可以做大量的编辑…

【Linux】权限管理(文件的访问者、类型和访问权限,chmod、chown、chgrp、umask,粘滞位)

目录 00.前言 01.文件访问者的分类 02.文件类型和访问权限 文件类型: 文件基本权限: 03.文件权限值的表示方法 04.访问权限的设置 (1)chmod (2)chown (3)chgrp &#xff0…

Linux:kubernetes(k8s)Deployment的操作(12)

创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…

mysql中 COALESCE和CASE WHEN的使用以及创建或替换视图

create or replace view 自理能力评估视图 as SELECT ehr_zlnlpg.ID AS ID, ehr_zlnlpg.GRID AS GRID, ehr_zlnlpg.TJID AS TJID, ehr_grjbxx.Name AS 姓名, ehr_grjbxx.Sex AS 性别, ehr_grjbxx.Cardnum AS 身份证号, ehr_zlnlpg.SCORESUM AS 总…

代码随想录 贪心算法-中等题目-序列问题

376.摆动序列 376. 摆动序列 中等 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如, [1, 7…

ELEVENLABS AI在线AI语音合成工具,28种语言

一、Elevenlabs简介 ElevenLabs 可以使用合成语音、克隆语音或全新的「人工」语音将文本转化为语音,并且这些语音可以模仿不同性别、年龄和种族的声音。 ElevenLabs基于目前强大的生成式语音模型,提供文本生成语音、语音合成、语音克隆和语音识别分类功…

【好玩的游戏项目】在Linux系统下部署star-battle太空飞船射击小游戏

【好玩的开源项目】在Linux系统下部署 star-battle太空飞船射击小游戏 一、star-battle小游戏介绍1.1 star-battle小游戏简介1.2 star-battle小游戏玩法1.3 开源地址 二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍2.3 Apache HTTP Server简介 三、安装httpd软件3.1 检查yu…