链表类型的无界阻塞线程安全队列-ConcurrentLinkedQueue(FIFO)

  ConcurrentLinkedQueue是非阻塞线程安全(volatile不能完全保证线程安全)的队列,适用于“高并发”的场景。是一个基于链表节点的无界线程安全队列,按照 FIFO(先进先出,尾先进头先出)原则对元素进行排序。队列元素中不可以放置null元素(内部实现的特殊节点除外)。

volatile作用:

  • volatile的作用是保证共享变量的可见性,不能保证原子性,也不能保证线程安全。
  • volatile的作用是确保所有线程在同一时刻读取到的共享变量的值是一样的。
  • 如果某个线程对volatile修饰的共享变量进行更新,那么其他线程可以立刻看到这个更新。

ConcurrentLinkedQueue的数据结构,如下图所示:
在这里插入图片描述

特点:

  • 都继承于AbstractQueue并实现BlockingQueue,说明有Queue的一些特性例如FIFO和一些方法。
  • ConcurrentLinkedQueue内部是通过链表来实现的。同时包含链表的头节点head和尾节点tail。ConcurrentLinkedQueue按照 FIFO(先进先出)原则对元素进行存储。元素都是从尾部插入到链表,从头部开始返回。
  • ConcurrentLinkedQueue的链表Node中的next的类型是volatile,而且链表数据item的类型也是volatile。ConcurrentLinkedQueue就是通过volatile来实现多线程之间内存数据的可见性,详看本人博客volatile(一)和volatile(二)。
  • 其中head节点存放链表第一个item为null的节点,tail则并不是总指向最后一个节点。

实操代码:

//ConcurrentLinkedQueue ------start   FIFO(尾先进头先出)ConcurrentLinkedQueue<Integer>concurrentLinkedQueue = new ConcurrentLinkedQueue();//将元素添加到队尾  add()内部也是调用的offer()concurrentLinkedQueue.add(331);//将元素添加到队尾concurrentLinkedQueue.offer(2);concurrentLinkedQueue.add(4);concurrentLinkedQueue.add(1);Arrays.stream(concurrentLinkedQueue.toArray()).forEach(a->{System.out.println("ConcurrentLinkedQueue add offer  "+a);});/*** ConcurrentLinkedQueue add offer  331* ConcurrentLinkedQueue add offer  2* ConcurrentLinkedQueue add offer  4* ConcurrentLinkedQueue add offer  1*/Integer peek2 = concurrentLinkedQueue.peek();System.out.println("ConcurrentLinkedQueue peek  "+peek2);//ConcurrentLinkedQueue peek  331//内部也是调的peek()方法
Integer peek3 = concurrentLinkedQueue.element();System.out.println(

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

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

相关文章

【rust工具链】

1 查看正在使用的工具链 命令&#xff1a;rustup show 结果显示&#xff1a; 从图中可以看到正在使用的是rustc 1.76.0版本&#xff0c;也可以看到已安装的所有版本的工具链 2 使用默认工具链 命令&#xff1a;rustup default 版本号 例如&#xff1a;rustup default 1.58…

【重学C语言】十五、文件操作

【重学C语言】十五、文件操作 文件的概念什么是流文件类型文本文件和二进制文件的区别文件指针文件指针常量预定义的文件指针stdin (标准输入)stdout (标准输出)stderr (标准错误输出)示例文件指针的声明使用文件指针悬挂指针示例文件缓冲区为什么需要缓冲区?缓冲区的类型缓冲…

Python语言绘制好看的小提琴图、箱形图、散点图、山脊图和柱状图等等

废话不多说&#xff0c;今天给大家分享一个&#xff0c;使用python绘制小提琴图、箱形图、散点图、山脊图和柱状图等等 图中的数据是随机生成的&#xff0c;图例&#xff0c;图注以及坐标题目各种信息&#xff0c;具体内容大家可以自己修改~ 效果图如下所示 &#x1f447;&a…

AIGC时代算法工程师的面试秘籍(2024.4.29-5.12第十三式) |【三年面试五年模拟】

写在前面 【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试方法&#xff0c;力求让读者在获得心仪offer的同时&#xff0c;增强技术基本面。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky…

『ZJUBCA Weekly Feed 07』MEV | AO超并行计算机 | Eigen layer AVS生态

一文读懂MEV&#xff1a;区块链的黑暗森林法则 01 &#x1f4a1;TL;DR 这篇文章介绍了区块链中的最大可提取价值&#xff08;MEV&#xff09;概念&#xff0c;MEV 让矿工和验证者通过抢先交易、尾随交易和三明治攻击等手段获利&#xff0c;但也导致网络拥堵和交易费用增加。为了…

ThreadPoolExecutor线程池使用以及源码解析

文章目录 1. 引子2. 线程池源码分析2.1. 总览2.2. Executor2.3. ExecutorService2.4. AbstractExecutorService2.5. ThreadPoolExecutor构造函数核心参数阻塞队列拒绝策略核心属性线程池状态Worker 类execute() 方法addWorker() 方法runWorker() 方法getTask() 方法processWork…

奇舞周刊第529期:万字长文入门前端全球化

周五快乐&#xff08;图片由midjourney生成&#xff09; 奇舞推荐 ■ ■ ■ 万字长文入门前端全球化 目前国内企业正积极开拓国际市场&#xff0c;国际化已成为重要的发展方向&#xff0c;因此产品设计和开发更需考虑国际化。本文介绍了语言标识、文字阅读顺序等诸多知识。然后…

Java面试题:Java中的并发集合有哪些?请举例说明它们的使用场景

Java中的并发集合是为多线程环境设计的&#xff0c;它们提供了线程安全的访问和操作。以下是Java中一些常见的并发集合及其使用场景&#xff1a; ConcurrentHashMap&#xff1a; 线程安全的HashMap实现。它通过将数据分布在多个段(segment)上&#xff0c;每个段单独加锁&#x…

ubuntu安装samba实现共享文件windows可查看ubuntu中的文件

samba的作用&#xff1a;实现共享linux/ubuntu系统中的文件&#xff0c;在windows直接查看操作ubuntu/linux中的文件、文件夹 1、安装samba sudo apt-get install samba如果不能安装samba&#xff0c;则更新apt-get sudo apt-get upgrade sudo apt-get update sudo apt-get d…

LeetCode热题100—链表(一)

160.相交链表 题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#x…

These relative modules were not found:* ../../../constant in

这个错误信息表明&#xff0c;你的项目在尝试加载一个相对路径模块 ../../../constant 时遇到了问题。具体来说&#xff0c;它在 ./node_modules/cache-loader/dist/cj 这个路径下找不到这个模块。 这里有几个可能的原因和相应的解决方案&#xff1a; 路径错误&#xff1a;首…

ts: 索引类型

一&#xff1a; 索引签名 索引签名用于定义对象类型&#xff0c;允许对象具有任意数量的属性&#xff0c;但属性名的类型必须是字符串&#xff08;在大多数情况下&#xff09;或数字&#xff08;在某些特定的上下文中&#xff0c;如数组或类似数组的对象&#xff09;。索引签名…

CHFS数据区县码(最全版本)

CHFS数据区县码&#xff08;最全版本&#xff09; CHFS数据区县码&#xff08;2011-2019年&#xff09;&#xff0c;数据真实可用&#xff0c;并可赠送chfs2011-2019年公开数据。

【Unity2D 2022:Cinemachine】相机跟随与地图边界

一、导入Cinemachine工具包 1. 点击Window-Package Manager&#xff0c;进入包管理界面 2. 点击All&#xff0c;找到Cinemachine工具包&#xff0c;点击Install 二、相机跟随角色 1. 选中Main Camera&#xff0c;点击Component-Cinemachine-CinemachineBrain&#xff0c;新建…

linux中sysfs创建设备节点的方法和DEVICE_ATTR

使用DEVICE_ATTR宏&#xff0c;可以定义一个struct device_attribute设备属性&#xff0c;使用函数sysfs_create_group或sysfs_create_file便可以在设备目录下创建具有show和store方法的节点。能方便的进行调试。 一、使用DEVICE_ATTR构建device attribute 下面将顺着我们直接…

Sping源码(八)—Spring事件驱动

观察者模式 在介绍Spring的事件驱动之前&#xff0c;先简单的介绍一下设计模式中的观察者模式。 在一个简单的观察者模式只需要观察者和被观察者两个元素。简单举个栗子&#xff1a; 以警察盯梢犯罪嫌疑人的栗子来说&#xff1a; 其中犯罪嫌疑人为被观察者元素而 警察和军人为…

【启程Golang之旅】基本变量与类型讲解

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

Fortran:forpy 嵌入Python

Fortran嵌入Python 利用forpy库&#xff0c;可以在Fortran程序内嵌入Python. program test_forpyuse forpy_modimplicit noneinteger::ierrierrforpy_initialize()!!---------------!!list!!---------------blocktype(list)::my_listierrlist_create(my_list)ierrmy_list%app…

【JVM】内存区域划分 | 类加载的过程 | 双亲委派机制 | 垃圾回收机制

文章目录 JVM一、内存区域划分1.方法区&#xff08;1.7之前&#xff09;/ 元数据区&#xff08;1.8开始&#xff09;2.堆3.栈4.程序计数器常见面试题&#xff1a; 二、类加载的过程1.类加载的基本流程1.加载2.验证3.准备4.解析5.初始化 2.双亲委派模型类加载器找.class文件的过…

Qml:第一个qml程序

//第一个qml程序import QtQuickText {height: 300text: "Hello World"width: 500 }推荐一个零声学院项目课&#xff0c;个人觉得老师讲得不错&#xff0c;分享给大家&#xff1a; 零声白金学习卡&#xff08;含基础架构/高性能存储/golang云原生/音视频/Linux内核&am…