并发编程工具集——并发容器-下(二十五)

news2024/9/9 1:01:20

List

  1. List 里面只有一个实现类就是 CopyOnWriteArrayList
  2. CopyOnWrite,写的时候会将共享变量新复制一份出来,读操作完全无锁;适合读多写少的场景,写操作会复制数组,在新的数组中操作
  3. 实现原理:CopyOnWriteArrayList 内部维护了一个数组,成员变量 array 就指向这个内部数组,所有的读操作都是基于 array 进行的,如下图所示,迭代器 Iterator 遍历的就是 array 数组。
    • 如果在遍历 array 的同时,还有一个写操作,例如增加元素,CopyOnWriteArrayList 会将 array 复制一份,然后在新复制处理的数组上执行增加元素的操作,执行完之后再将 array 指向这个新的数组。
    • 通过下图你可以看到,读写是可以并行的,遍历操作一直都是基于原 array 执行,而写操作则是基于新 array 进行。
  4. 注意事项(坑):
    • CopyOnWriteArrayList仅适用于写操作很少的场景,而且能够容忍读写短暂的不一致。
  5. CopyOnWriteArrayList迭代器是只读的,不支持增删改,因为遍历的是一个快照,对快照增删改显然没有用

Map

  1. Map接口实现了ConcurrentHashMap和ConcurrentSkipListMap,从应用角度来看主要区别在于ConcurrentHashMap的key是无序的,ConcurrentSkipListMap的key是有序的;
  2. 他们俩key-value都不能为null,否则报空
  3. ConcurrentSkipListMap 里面的 SkipList 本身就是一种数据结构,被称为跳表,跳表插入、删除、查询操作平均的时间复杂度是 O(log n),理论上和并发线程数没有关系,所以在并发度非常高的情况下,如果对 ConcurrentHashMap 的性能不满意,可以尝试一下 ConcurrentSkipListMap。

Set

  1. Set 接口的两个实现是 CopyOnWriteArraySet 和 ConcurrentSkipListSet,使用场景类似于CopyOnWriteArrayList和ConcurrentSkipListMap,原理都一样就是少了个Value。

 

Queue

  1. 可以从以下两个维度来对Queue分类:一个维度是阻塞与非阻塞;另一个维度是单端与双端
    • 阻塞与非阻塞:所谓阻塞指的是当队列已满时,入队操作阻塞;当队列已空时,出队操作阻塞。
    • 单端与双端:单端指的是只能队尾入队,队首出队;而双端指的是队首队尾皆可入队出队。
  2. Java 并发包里阻塞队列都用 Blocking 关键字标识,单端队列使用 Queue 标识,双端队列使用 Deque 标识。
  3. 这两个维度组合后,可以将 Queue 细分为四大类:单端阻塞队列、双端阻塞队列、单端非阻塞队列、双端非阻塞队列
    • 单端阻塞队列:
      1. 包括:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、LinkedTransferQueue、PriorityBlockingQueue 和 DelayQueue。
      2. 内部一般会持有一个队列,这个队列可以是数组(其实现是 ArrayBlockingQueue)也可以是链表(其实现是 LinkedBlockingQueue);甚至还可以不持有队列(其实现是 SynchronousQueue),此时生产者线程的入队操作必须等待消费者线程的出队操作。而 LinkedTransferQueue 融合 LinkedBlockingQueue 和 SynchronousQueue 的功能,性能比 LinkedBlockingQueue 更好;PriorityBlockingQueue 支持按照优先级出队;DelayQueue 支持延时出队。
    • 双端阻塞队列: 其实现是 LinkedBlockingDeque。
    • 单端非阻塞队列:其实现是 ConcurrentLinkedQueue。
    • 双端非阻塞队列:其实现是 ConcurrentLinkedDeque。

  4. 注意事项:
    • 使用队列时,需要格外注意队列是否支持有界(所谓有界指的是内部的队列是否有容量限制)。
    • 实际工作中,一般都不建议使用无界的队列,因为数据量大了之后很容易导致 OOM。
    • 只有 ArrayBlockingQueue 和 LinkedBlockingQueue 是支持有界的,所以在使用其他无界队列时,一定要充分考虑是否存在导致 OOM 的隐患。
      1. 这里的有界,是指生成队列的时候,在构造函数中指定队列的大小;
      2. 如果不指定,则认为是无界的,实际上,即使调用了无界的构造函数,其队列的大小就是Integer.MAX_VALUE

Fail-Fast(快速失败机制)

  1. 当一个线程遍历容器时,有另一个线程对其修改就会触发fail fast机制,遍历容器的线程也会抛出异常,本质是为了确保遍历时的线程安全,容器内部维护一个初始化为modCount的expectedModeCount变量,遍历时会去检查该期望值是否等于modCount,不等于就说明出现了修改集合操作(可以参考集合框架篇)

 

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

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

相关文章

备考软考高级系统架构设计师,需要买哪些资料?

距离2024下半年软考高级系统架构设计师考试仅剩三个月!时间紧迫,单单啃书已经不够了,毕竟是软考高级科目,难度不是那些初、中级可以比拟的。要想短时间速通架构考试,学会抓重点真的很重要,45分说多不多说少…

【音视频】RTSP、RTMP与流式传输

文章目录 前言RTSP与RTMPRTSP(Real-Time Streaming Protocol)RTMP(Real-Time Messaging Protocol)主要差异 什么是流式传输?流式传输的特点流式传输与传统下载的区别 使用VLC播放RTSP监控 总结 前言 在现代网络环境中…

C++ //练习 16.2 编写并测试你自己版本的compare函数。

C Primer(第5版) 练习 16.2 练习 16.2 编写并测试你自己版本的compare函数。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /*********************************************************************…

PyTorch深度学习快速入门(下)

PyTorch深度学习快速入门(下) 一、现有网络模型的使用及修改(一)背景知识(二)修改网络模型的三种方法 二、网络模型的保存与加载(一)保存网络模型的两种方法(二&#xff…

阿里云 服务器安装rabbit

现在我们去服务器安装一个rabbit 进入home 创建一个rabbit文件夹 /home/rabbit vim deployRabbit.sh 脚本内容 #!/bin/bash docker run -d \ --name dev.rabbit \ --network dev-net \ -p 15672:15672 \ -v ./data:/var/lib/rabbitmq \ --hostname dev.rabbit \ rabbitmq:…

css3 红色阴影边框紧急提醒呼吸灯特效

效果截图 代码 <!DOCTYPE html> <html><head><title>红色呼吸灯紧急特效</title><style>keyframes alarm {0% {box-shadow: 0 0 30px #ff0000;}50% {box-shadow: 0 0 60px #ff0000, inset 0 0 60px #ff0000;}100% {box-shadow: 0 0 30px …

八、【Python】基础 - 【Python while 循环全解析】:掌握无限循环的艺术

&#x1f4a1;&#x1f4da;【Python while 循环全解析】&#xff1a;掌握无限循环的艺术&#x1f4da;&#x1f4a1; 目录 1.基本语法 2.示例 3.注意事项 4.嵌套循环与循环控制语句 5.示例&#xff1a;使用 break 和 continue 6.示例&#xff1a;计数器 7.示例&#xf…

Web:Url 编码 -13

URL编码概述 HTTP协议只支持iso8859-1字符集。 而此字符集中只有英文数字常见符号。 所以HTTP原生是无法传输非iso8859-1字符的。 为了解决这个问题&#xff0c;提出了一种称之为URL编码的解决方案。 URL编解码详解 将非iso8859-1字符&#xff0c;进行转换 先将字符按照指定码表…

时间序列分析方法之 -- 自回归移动平均模型(Autoregressive Moving Average, ARMA)原理及Python代码示例

目录 原理 适用情况 Python 示例代码 结论 原理 自回归移动平均模型&#xff08;Autoregressive Moving Average, ARMA&#xff09;是一种结合了自回归&#xff08;AR&#xff09;模型和移动平均&#xff08;MA&#xff09;模型的时间序列分析模型。它适用于描述和预测平稳…

AGI思考探究过程中的意义、价值与乐趣 Ⅰ

探究以泛GPT为代表的预训练自回归next token prediction GenAI(即llm)与Alpha系列为代表的RL&#xff0c;再到Sora为代表的DiT视觉生成领域模型的本质普遍性及表象差异&#xff0c;以及为什么要将其两者或三者联系甚至融合起来看待&#xff1f;本质上是尝试对比采用上述三种模型…

昇思MindSpore 应用学习-Diffusion扩散模型-CSDN

Diffusion扩散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c;执行Python文件时&#xff0c;请…

【项目管理】高手项目经理都在用的6个SOP

SOP&#xff08;Standard Operating Procedure&#xff09;流程是一种标准化的操作指南&#xff0c;旨在确保组织或团队在各种情况下都能高效、一致地完成任务。SOP流程通常包括详细的步骤、关键控制点和责任分配&#xff0c;以确保质量和安全。SOP流程涉及从日常运营到危机管理…

五、Spring Boot - 上手篇(1)

&#x1f33b;&#x1f33b;目录 一、快速入门&#xff1a;创建第一个SpringBoot 工程1.1 点击File--->New--->Project...1.2 选择版本和依赖的相关骨架包1.3 设置项目保存目录1.4 项目创建完成&#xff0c;工程主界面如下1.5 项目说明1.6 启动项目1.7 编写 HelloControl…

2024年7月23日~2024年7月29日周报

目录 一、前言 二、完成情况 2.1 一种具有边缘增强特点的医学图像分割网络 2.2 融合边缘增强注意力机制和 U-Net 网络的医学图像分割 2.3 遇到的困难 三、下周计划 一、前言 上周参加了一些师兄师姐的论文讨论会议&#xff0c;并完成了初稿。 本周继续修改论文&#xff0…

【Git】 如何将一个分支的某个提交合并到另一个分支

【Git】 如何将一个分支的某个提交合并到另一个分支 在使用 Git 进行版本控制时&#xff0c;常常会遇到这样的需求&#xff1a;将某个分支的特定提交合并到另一个分支中。这种情况下&#xff0c;我们可以使用 cherry-pick 命令来实现。本文将详细介绍 cherry-pick 命令的使用方…

定时任务报错问题,通级下还有其他定时任务却没有报错,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

R语言统计分析——条形图

参考资料&#xff1a;R语言实战【第2版】 条形图通过垂直的或水平的条形展示了类别型变量的分布&#xff08;频数&#xff09;。函数barplot()的最简单用法是&#xff1a; barplot(height) 其中height是一个向量或一个矩阵。 本文中数据案例来自“vcd”包&#xff0c;需在第一…

JQuery异步请求与Flask后端通信、this和event指针汇总

目录 一.JQuery与Flask通信的三种方法 1.1$.ajax() 1.2$.get() 1.3$.post() 二.forEach()方法 三.this指针 3.1为什么要用this指针 3.2this的指向 3.3this指针的四种绑定方式 3.3.1默认绑定 3.3.2隐式绑定 3.3.3显式绑定 3.3.4new绑定 3.3.5通过标签调用this指针…

windows server服务器/linux服务器离线安装pandas

windows server服务器/linux服务器离线安装pandas pypi官网下载whl文件速度较慢&#xff0c;推荐使用国内的镜像源来下载&#xff0c;镜像源地址为 清华大学 &#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple…

docker安装与container基本使用

安装 Homebrew 的 Cask 已经支持 Docker for Mac, mac用户狂喜 brew install --cask --appdir/Applications docker其他入门用法可参考 Docker Hello World- 菜鸟教程 或网上自行搜索博客学习。本文主要记录我运行go-zero-mall用到的一些注意点。当然&#xff0c;gonivinck项…