ConcurrentLinkedQueue

news2024/11/19 17:40:19

唯一一个使用cas实现的线程安全并发效率高的集合。

一、为什么叫松散队列?

链表是松散的,链表节点并不都是有效的,允许存在无效节点val=null,但是只有最后一个节点才能next=null
为什么线程安全需要把链表做成松散的。就是因为入队分为两步,cas设置最后一个节点的next,和cas设置tail,两个操作之间并无原子性,所以可能并发操作了多个cas设置next,才设置tail。tail滞后很多。
出队的时候,也需要分为两步,cas将值设置成null。cas移动head。head也会滞后很多。所以会有很多节点已经出队为null,但是依然可以遍历到。因此叫做松散队列。

二、如何实现线程安全?

add入队操作
tail节点并不是最后一个节点,
1、从 tail 节点开始遍历到尾节点,若定位到尾节点(p.next == null),则入队。
2、遍历过程中,如果遍历到无效节点(p.next == p)说明p已经并发出队,需要重新从有效节点(tail 或 head)开始遍历。
3、遍历过程中,时刻关注 tail 节点是否无效。若无效了需要重新从最新的 tail(如果tail失效,从head) 开始遍历,否则继续遍历当前的下一个节点。
4、找到最后一个节点后,进行入队操作,使用cas将next修改为新节点,如果tail->next!=null,需要使用cas将tail设置为新节点。

cas设置next,和cas设置tail,两个操作之间并无原子性,所以可能并发操作了多个cas设置next,才设置tail。tail滞后很多。如下图B节点已经被poll了,tail还在B节点前面。tail失效了,从tail无法遍历到最后一个节点。
在这里插入图片描述

poll出队操作
1、从 head 节点开始遍历找出首个有效节点(p.item != null),返回该节点的数据(p.item)。
2、遍历过程中,如果遍历到尾节点(p.next == null),则返回空。
3、遍历过程中,如果遍历到无效节点(p.next == p),说明其他线程修改了 head,需要重新从有效节点(新的 head)开始遍历。
4、cas将值设置成null。cas移动head。
4、更新head,需要注意的是,并不是每次出队时都执行 updateHead() 更新 head 节点:
当 head 节点里有元素时,直接弹出 head 节点里的元素,设置为null,而不会更新 head 节点。
在这里插入图片描述

只有当 head 节点里没有元素时,出队操作才会更新 head 节点。

在这里插入图片描述

三、优缺点

从它的入队出队机制就可以看出,优缺点非常明显。
优点:
1、并发效率高,入队出队不需要加锁进行线程同步,全程使用cas操作
缺点:
1、入队出队都分为两步cas,cas之间是控制不了的,所以会产生tail滞后,tail失效,链表节点poll了,还可以继续访问没有释放,内存是松散的,无效节点占用内存,内存开销大。
2、由于head和tail都不是严格指向头尾,每次poll,add都需要遍历,浪费时间效率。concurrentLinkedQueue存的元素越多,效率越低。因此只适合高并发小容量的场景使用。

参考文章:
https://blog.csdn.net/weixin_52801742/article/details/115314236?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168206622916800186572368%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168206622916800186572368&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-115314236-null-null.142v86insert_down38v5,239v2insert_chatgpt&utm_term=%E6%9D%BE%E6%95%A3%E9%98%9F%E5%88%97%E7%9A%84%E5%9C%BA%E6%99%AF&spm=1018.2226.3001.4187

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

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

相关文章

蓝精灵协会 (The Smurfs‘ Society) 宣布与著名艺术家展开一系列的合作,打造传奇 PFP 系列

4 月 18 日,The Smurfs Society 将推出第一个由 Smurfs 品牌支持的官方 PFP 系列。该系列建立在链上游戏的基础之上,该游戏聚集了超过 85,000 名玩家,并在设计、创意和与著名艺术家的合作方面设立了新标准。 而最近,蓝精灵官方&am…

2023-04-21 学习记录--C/C++-实现升序降序(选择法)

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、选择法 —— 升序 ⭐️ (一)、思路 从左到右,除最后一个数 依次作为 “当前数” 与 其右…

STM32F4_模数转换器(ADC)详解

目录 1. ADC是什么 2. ADC主要特性 3. ADC框图 3.1 ADC开关控制 3.2 ADC时钟 3.3 通道选择 3.4 单次转换模式和连续转换模式 3.5 时序图 3.6 模拟看门狗 4 温度传感器 5. ADC中断 6. ADC初始化结构体 6.1 ADC相关实验配置 7. 相关寄存器 7.1 ADC控制寄存器&…

Deep Neural Network for YouTube Recommendation论文精读

这篇论文 Deep Neural Networks for YouTube Recommendations 是google的YouTube团队在推荐系统上DNN方面的尝试,发表在16年9月的RecSys会议。本文所介绍的YouTube的推荐系统主要包括Deep Candidate Generation model和Deep Ranking model两个部分:Deep …

AWS EC2使用过程总结

步骤1:开通AWS账号 需要一个邮箱、一个信用卡账号;有第一年的免费试用,EC2每个月免费试用750小时;注册完成后,得到实例管理平台: 步骤2:开通EC2实例 步骤3:开通网关和安全组&…

【Python小技巧】一步到位升级到pandas 2.0.0正式版

文章目录 前言一、Pandas是什么?二、Pandas 2.0.0的升级特性三、升级安装Pandas 2.0.0正式版总结 前言 工欲善其事必先利其器,大数据、AI时代,目前Python 最新版本是3.11 ,而Pandas也刚刚完成大升级,进入 2.0.0时代。…

ChatGPT 中的人类反馈强化学习 (RLHF) 实战

目录 1 前言2 人类反馈强化学习 (RLHF)2.1 奖励模型 (RM)2.2 近端策略优化算法 (PPO) 3 总结4 参考 团队博客: CSDN AI小组 相关阅读 ChatGPT 简介大语言模型浅探一关于 ChatGPT 必看的 10 篇论文从 ELMo 到 ChatGPT:历数 NLP 近 5 年必看大模型 1 前言 在当今数字…

整型、浮点型与字符串相互转换(C/C++)

文章目录 1. 整型、浮点型 -> 字符串2. 字符串 -> 整型3.字符串 -> 浮点型 1. 整型、浮点型 -> 字符串 A. 函数原型:   B. 分析  通常整型转换一般都是准确的,但是浮点型进行转换的时候因为精度问题有效数字位可能会出现一些偏差.   C. …

pushmall推贴共享电商2023年4月计划

Pushmall推贴共享电商2023年4月计划 2023年 二月份优化完成 1、商圈套餐卡:商品、优惠券、活动优化; 2、会员预充值一卡通:指定商家会员卡充值优惠; 3、商家海报:店铺海报、商品海报、商圈卡海报优化。 4、首页重新布…

SpringBoot(5)整合缓存

Springboot整合缓存 缓存SpringBoot内置缓存整合Ehcache缓存数据淘汰策略整合Memcached缓存SpringBoot整合jetcache缓存纯远程方案纯本地方案本地远程方案方法缓存远程方案的数据同步数据报表 SpringBoot整合j2cache缓存 缓存 企业级应用主要作用是信息处理,当需要…

【STM32】基础知识 第六课 内核 架构

【STM32】基础知识 第六课 内核 & 架构 F1 系统架构F4 系统架构F7 系统架构H7 系统架构 F1 系统架构 4 个主动单元 4 个被动单元 主动单元被动单元Cortex M3 内核 DCode 总线 (D-Bus)内部 FLASHCortex M3 内核系统总线 (S-Bus)内部 SRAM通用 DMA1FSMC通用 DMA2AHB 到 AP…

PCA主成分分析 从零理解

一、PCA的目的 假设我们有一堆观测到的数据。 数据的格式是observation*feature,每一行是一个观测(也就是图里的一个点),每一列是这个数据的某个特征(即一个维度)。 假设数据矩阵是A,有m个观测…

辉煌优配|刚刚!“中字头”再度爆发

今天早盘,A股全体持续震动收拾,上证50指数跌破2700点整数关口,沪深300亦失守4100点。 盘面上,国防军工、种业、中字头、电气设备等板块涨幅居前,前期抢手的人工智能、半导体、信创、软件服务等板块全线回调。北上资金净…

零售店铺管理系统有哪些作用?选择零售管理系统要注意这4大问题

零售店铺管理系统主要是帮助实体零售店提高销售效率、降低成本、提升服务质量和客户满意度。 对于零售店铺来说,选择一款合适的零售店铺管理系统,可以有效提高其管理效率和精准度,同时也有利于自家店铺在市场竞争中占据优势。 一、零售店铺管…

Keil系列教程02_新建基础软件工程

1写在前面 目前Keil的四款产品(软件):MDK-ARM、C51、C251、C166,在用法上极为相似,包括本文讲述的新建软件工程。 本文以目前(2018年10月)最新Keil MDK-ARM V5.26、STM32F103标准外设库为例&am…

晨控CK-FR208-PN与西门子PLC工业Profinet协议通讯指南

晨控CK-FR208-PN是一款支持标准工业Profinet协议的多通道工业RFID读写器,读卡器工作频率为13.56MHZ,支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读写。 读卡器同时支持标准工业通讯协议Profinet,方便用户通集成到PLC等…

电子模块|外控集成 LED 光源 WS2812模块---软件驱动stm32版

电子模块|外控集成 LED 光源 WS2812模块---软件驱动stm32版 模块简介单线归零码通讯方式24bit 数据结构 stm32 驱动 模块简介 WS2812是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智…

CxImage学习使用1:环境搭建

目录 前言 一、CxImage相关介绍 二、编译源码 三、将CxImage使用到自己的工程中 前言 CxImage是一个可以用于MFC 的C图像处理类库类,它可以打开,保存,显示,转换各种常见格式的图像文件,比如BMP, JPEG, GIF, PNG, TI…

“cnpm : 无法加载文件 C:\Users\xx\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本“ 解决办法

系统安全策略原因导致cnpm安装依赖包的时候提示以下错误,解决方案: 错误详情: cnpm : 无法加载文件 C:\Users\xx\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsof…

大家经常说的java八股文到底是什么?让我来总结一下吧!

八股文问题集合 面试必看java八股文 问题正在收录中,累了休息一会,如果有需要请,先关注,这几天会更帖子,答案后续补上 文章目录 八股文问题集合问题正在收录中,累了休息一会,如果有需要请&#…