一文彻底搞懂并发容器

news2024/11/27 14:50:36

文章目录

  • 1. 什么是并发容器
  • 2. 并发容器的分类

1. 什么是并发容器

并发容器是一种用于多线程环境的数据结构,它们能够有效地处理并发访问和修改的问题。在多线程应用程序中,多个线程可能会同时访问和修改共享的数据结构,这可能会导致数据不一致、竞态条件和其他并发问题。并发容器通过实现特定的算法和机制来确保线程安全性,从而有效地管理共享数据结构的并发访问。

2. 并发容器的分类

在这里插入图片描述

1.ConcurrentHashMap

优点:

  • 高并发性能:采用分段锁(JDK6)或 CAS 无锁算法(JDK8),提供了高效的并发读写操作。
  • 线程安全:可以安全地被多个线程同时访问,而无需额外的同步措施。
  • 支持复合操作:提供了一些原子性的复合操作,如 putIfAbsent(), remove(), replace() 等。

缺点:

  • 初始容量影响性能:初始容量设置不合理可能导致性能问题,需要根据实际场景进行调优。
  • 内存消耗较大:由于维护了多个 Segment 或节点,可能会占用较多的内存空间。

实现方法:

  • JDK6 使用分段锁:将整个数据集分成多个 Segment,每个 Segment 作为一个小的 Hash 表,提高并发度。
  • JDK8 使用 CAS 无锁算法:通过 CAS 操作和 volatile 关键字来保证线程安全。
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("key", "value");

2.CopyOnWriteArrayList

优点:

  • 适用于读多写少的场景:读操作不加锁,性能高;写操作通过复制整个数组来保证线程安全。
  • 线程安全:可以安全地被多个线程同时访问,而无需额外的同步措施。
  • 迭代安全:在迭代过程中支持并发修改。

缺点:

  • 写操作代价高昂:每次写操作都需要复制整个数组,可能会消耗大量内存和 CPU 时间。
  • 不适用于频繁写操作的场景:频繁写操作可能导致性能下降。

实现方法:

  • 写操作时复制数组:写操作先复制一份新的数组,在新数组上进行修改,然后再将新数组赋值给旧的引用。
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("value");

3.ConcurrentSkipListMap

优点:

  • 高并发性能:基于跳表实现,支持高并发读写操作,具有较高的性能。
  • 线程安全:可以安全地被多个线程同时访问,而无需额外的同步措施。
  • 按 Key 排序:支持按 Key 排序,适用于需要按照顺序访问元素的场景。

缺点:

  • 内存占用较大:维护跳表结构可能会占用较多的内存空间。
  • 部分操作较慢:部分操作的性能可能不如哈希表实现的 Map。

实现方法:

  • 基于跳表结构实现:跳表是一种有序链表的数据结构,通过多级索引提高查找效率。
ConcurrentSkipListMap<String, String> map = new ConcurrentSkipListMap<>();
map.put("key", "value");
  1. ConcurrentLinkedQueue

优点:

  • 高并发性能:基于链表实现,支持高效的并发插入和获取操作。
  • 无锁设计:采用无锁设计,避免了线程阻塞和竞争。

缺点:

  • 不支持随机访问:无法通过索引进行随机访问,只能从头部或尾部进行操作。

实现方法:

  • 基于链表实现:通过 CAS 操作保证并发访问的线程安全。
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
queue.offer("value");
  1. LinkedBlockingQueue

优点:

  • 高并发性能:基于链表实现,支持高效的并发插入和获取操作。
  • 阻塞操作:支持阻塞的插入和获取操作,适用于生产者-消费者模型。

缺点:

  • 固定容量:ArrayBlockingQueue 的容量固定,无法动态扩容。
  • 对于 LinkedBlockingQueue 虽然容量可以动态调整,但也存在一定的性能开销。

实现方法:

  • 基于链表或数组实现:使用 ReentrantLock 和 Condition 实现阻塞操作。
BlockingQueue<String> queue = new LinkedBlockingQueue<>();
queue.put("value");
  1. ArrayBlockingQueue

优点:

  • 高并发性能:基于数组实现,支持高效的并发插入和获取操作。
  • 固定容量:容量固定,避免了动态扩容带来的性能开销。

缺点:

  • 固定容量:无法动态扩容,一旦满了无法插入新元素。
  • 阻塞操作:支持阻塞的插入和获取操作,但可能引发线程阻塞。

实现方法:

  • 基于数组实现:使用 ReentrantLock 和 Condition 实现阻塞操作。
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
queue.put("value");

7.PriorityBlockingQueue

优点:

  • 高并发性能:支持高效的并发插入和获取操作,适用于需要按照优先级访问元素的场景。

缺点:

  • 容量受限:虽然容量可以动态调整,但也存在一定的性能开销。

实现方法:

  • 基于二叉堆实现:通过 ReentrantLock 和 Condition 实现线程安全操作。
PriorityBlockingQueue<String> queue = new PriorityBlockingQueue<>();
queue.put("value");

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

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

相关文章

npm卸载不掉的解决方案

不管怎么重装重启都报错 真服了&#xff0c;npm卸载不掉绝对是有缓存存在&#xff0c;用where npm查到d盘 实际上根本不在这个地方&#xff0c;这个是我安装的6.14.12版本的npm的地方&#xff0c;我说我怎么怎么重装怎么导包都不行呢&#xff0c;偷偷隐藏在这个目录里面&#…

vue3路由代码示例

路由简单分三步吧 第一定义路由&#xff1a; 包括访问地址&#xff0c;对应组件 第二使用&#xff1a;在index.html中使用它 下面是代码示例&#xff1a; components/Person.vue <template><router-link to"/test/hello">跳转</router-link>&…

简易TCP服务器通信、IO多路复用(select、poll、epoll)以及reactor模式。

网络编程学习 简单TCP服务器通信TCP三次握手和四次挥手三次握手&#xff08;如下图&#xff09;常见问题&#xff1f; 四次挥手 client和server通信写法server端client端 通信双方建立连接到断开连接的状态转换怎么应对多用户连接&#xff1f;缺点 IO多路复用select优缺点 poll…

Linux---命令行参数

一、命令行参数 在介绍命令行参数前&#xff0c;我想问大家一个问题&#xff0c;在以前写C/C时&#xff0c;main 函数可不可以带参数&#xff1f; 答案是可以带的&#xff0c;int main(int argc, char* argv[]){}&#xff0c;但平时写代码时也证明了&#xff0c;main 函数的参…

Gradle连接超时问题connect time out

出现这样的问题不要慌张&#xff0c;可能是你配置gradle的问题一步一步来解决就完事了 1. 出现这样的问题首先我们先检查配置 首先我们先看到的标出来的地址可以看到&#xff0c;我们需要下载的是这个链接里面的压缩包数据&#xff0c;查看版本以及这个链接是不是错误的 2. 第…

[OpenCV学习笔记]Qt+OpenCV实现图像灰度反转、对数变换和伽马变换

目录 1、介绍1.1 灰度反转1.2 图像对数变换1.3 图像伽马变换 2、效果图3、代码实现4、源码展示 1、介绍 1.1 灰度反转 灰度反转是一种线性变换&#xff0c;是将某个范围的灰度值映射到另一个范围内&#xff0c;一般是通过灰度的对调&#xff0c;突出想要查看的灰度区间。 S …

大创项目推荐 深度学习 opencv python 实现中国交通标志识别_1

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

Windows下载使用nc(netcat)命令

‘nc’ 不是内部或外部命令&#xff0c;也不是可运行的程序&#xff1f; 点击链接地址&#xff0c;下载压缩包。 完成后解压 使用方式&#xff08;三种&#xff09;&#xff1a; 1、直接双击exe使用 2、把这个exe放到cmd启动的默认路径下 放到默认路径下&#xff0c;使用nc&a…

【Deep Learning 11】Graph Neural Network

&#x1f31e;欢迎来到图神经网络的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年3月20日…

openLooKeng开发环境搭建

文章目录 搭建OpenLooKeng开发环境要求 以下是搭建OpenLooKeng开发环境的基本步骤&#xff1a;1、从OpenLooKeng的GitHub仓库克隆代码&#xff1a;2、 构建OpenLooKeng生成IntelliJ IDEA项目文件 airbase构建项目过程中出现的问题checkstyle错误版本冲突问题hetu-heuristic-ind…

辽宁政府采购网怎么入驻?

辽宁政府采购网的入驻流程包括以下几个主要步骤&#xff1a; 注册账号&#xff1a;在辽宁政府采购网上商城注册账号。CA证书领取&#xff1a;注册成功后&#xff0c;需要领取CA证书以登录网上商城。搭建自营商城&#xff1a;因为后期需要和辽宁政府采购网上商城进行入驻&#…

执行 kubeadm join 报错ERROR FileAvailable--etc-kubernetes-kubelet.conf

执行 kubeadm join 报错ERROR FileAvailable–etc-kubernetes-kubelet.conf [rootk8snode2 ~]# kubeadm join apiserver.demo:6443 --token c4nezq.ecv2kg9ok6gsresw --discovery-token-ca-cert-hash sha256:be1a55bea6b5bb5c8810434d3905a9cd0bbc33181862f7ad601346e1ab0…

.NET CORE 分布式事务(二) DTM实现TCC

目录 引言&#xff1a; 1. TCC事务模式 2. TCC组成 3. TCC执行流程 3.1 TCC正常执行流程 3.2 TCC失败回滚 4. Confirm/Cancel操作异常 5. TCC 设计原则 5.1 TCC如何做到更好的一致性 5.2 为什么只适合短事务 6. 嵌套的TCC 7. .NET CORE结合DTM实现TCC分布式事务 …

wireshark创建显示过滤器实验简述

伯克利包过滤是一种在计算机网络中进行数据包过滤的技术&#xff0c;通过在内核中插入过滤器程序来实现对网络流量的控制和分析。 在数据包细节面板中创建显示过滤器&#xff0c;显示过滤器可以在wireshark捕获数据之后使用。 实验拓扑图&#xff1a; 实验基础配置&#xff1…

计算机专业在找工作时的注意事项

目录 说在前面关于我一些忠告关于简历关于银行写在最后 说在前面 满满的求生欲。我不是什么大佬&#xff0c;更没有能力教大家什么。只是看到有不少学弟学妹&#xff0c;还在为找一份工作焦头烂额&#xff0c;却没有努力的方向。所以这里斗胆给计算机相关专业的学弟学妹们的一…

【动手学深度学习-pytorch】 9.4 双向循环神经网络

在序列学习中&#xff0c;我们以往假设的目标是&#xff1a; 在给定观测的情况下 &#xff08;例如&#xff0c;在时间序列的上下文中或在语言模型的上下文中&#xff09;&#xff0c; 对下一个输出进行建模。 虽然这是一个典型情景&#xff0c;但不是唯一的。 还可能发生什么其…

文件操作(随机读写篇)

1. 铺垫 建议先看&#xff1a; 文件操作&#xff08;基础知识篇&#xff09;-CSDN博客 文件操作&#xff08;顺序读写篇&#xff09;-CSDN博客 首先要指出的是&#xff0c;本篇文章中的“文件指针”并不是指FILE*类型的指针&#xff0c;而是类似于打字时的光标的东西。 打…

EMD关于信号的重建,心率提取

关于EMD的俩个假设&#xff1a; IMF 有两个假设条件&#xff1a; 在整个数据段内&#xff0c;极值点的个数和过零点的个数必须相等或相差最多不能超过一 个&#xff1b;在任意时刻&#xff0c;由局部极大值点形成的上包络线和由局部极小值点形成的下包络线 的平均值为零&#x…

WebGIS开发

1.准备工作 高德开发API注册账号&#xff0c;创建项目拿到key和密钥 高德key 2.通过JS API引入高德API <html><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><metaname&quo…

Ubuntu上安装d4rl数据集

Ubuntu上安装d4rl数据集 D4RL的官方 github: https://github.com/Farama-Foundation/D4RL 一、安装Mujoco 1.1 官网下载mujoco210文件 如果装过可以跳过这步 链接&#xff1a;https://github.com/deepmind/mujoco/releases/tag/2.1.0 下载第一个文件即可。我这里是在windo…