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

本文主要是介绍链表类型的无界阻塞线程安全队列-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(

这篇关于链表类型的无界阻塞线程安全队列-ConcurrentLinkedQueue(FIFO)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005080

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<