LinkedBlockQueue生产消费源码解析
LinkedBlockQueue自JDK1.5以后提供的一种阻塞队列,遵循生产者消费者模式,实现了BlockQueue接口,如图

从它的名字可以了解到它是采用链表的方式实现了阻塞队列,并且定义了“节点”的内部类,如图

我们看到,每个Node当中除了Node的数据item以外只有一个next节点来指向下一个节点。
另外LinkedBlockQueue在实现里采用了ReentrantLock来控制生产和消费等操作的并发情况,并且采用关联的Condition来做阻塞等待,所以它是线程安全的。

DEMO
接下来,我们把LinkedBlockQueue的DEMO作为入口,代码如下

构造方法
构造方法允许指定队列最大容量,如果不指定则采用INT的最大值。所以LinkedBlockQueue实际上也属于有界队列,只是它的默认队列容量很大,一般情况下不会出现超过容量的情况。

LinkedBlockQueue定义了head和last节点分别表示起始和结束,是一种双端链表的实现方式,head的item永远为null,last的next永远为null,当队列为空的时候head节点和last节点指向一个空的Node

生产操作offer(E e)
offer(E e)方法仅提供一个数据入参,如果容量未满则入队,如果满了那么直接结束。

入队方法很简单,就是将当前最后一个节点的next指向新的节点,并且新的节点成为最后一个节点

生产操作offer(E e, long timeout, TimeUnit unit)
该方法与普通offer方法的区别在于提供了超时时间,也就是说在没有空间可以增加元素的时候会进行阻塞等待,这里采用Condition的方式实现

生产操作put(E e)
put方法跟offer的区别在于,如果没有足够的空间put会一直等待直到中断或者有空间

消费操作poll()
poll操作不会进行等待,如果没有待消费的元素,那么直接返回

出队操作就是把当前的第一个head节点的next指向自己,真正的第一个node节点成为head节点

消费操作poll(long timeout, TimeUnit unit)
如果没有待消费的数据,该方法会进行等待,直到有消费数据或者中断

消费操作take()
跟put类似take是一个会一直等待的操作,如果没有待消费的数据那么就阻塞直到中断或者消费到数据

LinkedBlockQueue在的生产和消费操作是通过互斥锁来控制并发的,也就是同时只会有一个生产操作或者一个消费操作,当生产操作完成会通知等待消费线程,消费操作完成会通知等待生产的线程。
LinkedBlockQueue生产消费源码解析的更多相关文章
- [源码解析] 并行分布式任务队列 Celery 之 消费动态流程
[源码解析] 并行分布式任务队列 Celery 之 消费动态流程 目录 [源码解析] 并行分布式任务队列 Celery 之 消费动态流程 0x00 摘要 0x01 来由 0x02 逻辑 in komb ...
- 时序数据库 Apache-IoTDB 源码解析之系统架构(二)
上一章聊到时序数据是什么样,物联网行业中的时序数据的特点:存量数据大.新增数据多(采集频率高.设备量多).详情请见: 时序数据库 Apache-IoTDB 源码解析之前言(一) 打一波广告,欢迎大家访 ...
- Java并发包源码学习系列:阻塞队列实现之ArrayBlockingQueue源码解析
目录 ArrayBlockingQueue概述 类图结构及重要字段 构造器 出队和入队操作 入队enqueue 出队dequeue 阻塞式操作 E take() 阻塞式获取 void put(E e) ...
- Java并发包源码学习系列:阻塞队列实现之SynchronousQueue源码解析
目录 SynchronousQueue概述 使用案例 类图结构 put与take方法 void put(E e) E take() Transfer 公平模式TransferQueue QNode t ...
- Java并发包源码学习系列:阻塞队列实现之LinkedTransferQueue源码解析
目录 LinkedTransferQueue概述 TransferQueue 类图结构及重要字段 Node节点 前置:xfer方法的定义 队列操作三大类 插入元素put.add.offer 获取元素t ...
- [源码解析] 消息队列 Kombu 之 基本架构
[源码解析] 消息队列 Kombu 之 基本架构 目录 [源码解析] 消息队列 Kombu 之 基本架构 0x00 摘要 0x01 AMQP 1.1 基本概念 1.2 工作过程 0x02 Poll系列 ...
- [源码解析] 并行分布式框架 Celery 之架构 (1)
[源码解析] 并行分布式框架 Celery 之架构 (1) 目录 [源码解析] 并行分布式框架 Celery 之架构 (1) 0x00 摘要 0x01 Celery 简介 1.1 什么是 Celery ...
- [源码解析] 并行分布式任务队列 Celery 之 EventDispatcher & Event 组件
[源码解析] 并行分布式任务队列 Celery 之 EventDispatcher & Event 组件 目录 [源码解析] 并行分布式任务队列 Celery 之 EventDispatche ...
- [源码解析] 深度学习分布式训练框架 horovod (19) --- kubeflow MPI-operator
[源码解析] 深度学习分布式训练框架 horovod (19) --- kubeflow MPI-operator 目录 [源码解析] 深度学习分布式训练框架 horovod (19) --- kub ...
随机推荐
- C# 不添加WEB引用调用WSDL接口
在项目中添加WEB引用耦合度较高,更新时要更新引用,所以我建议不添加WEB引用调用WSDL接口,废话不多说,直接上代码 例如WSDL地址为:http://XXX.XX.XXX.XXX:9115/WsP ...
- .net图表之ECharts随笔02-字符云
后续每一类图表,若无特殊说明,都将建立在01的基础上,修改参数option,且参数均以json的格式 要形成如图所示的字符云,一般需要设置两个大参数——title和series 其中,title就是图 ...
- powerviot report cannot refresh data
配置完成powerviot后发现打开excel无法刷新数据源连接提示出错: 在security token service服务应用中新建application,如图创建,然后将excel里面的auth ...
- node.js实现WebSocket
最近在学习“HTML5游戏开发实战”,其中第8章内容是使用WebSocket来构建多人游戏---<你画我猜>.然而在实现过程中,却一直出错: 客户端请求时,服务器端会报错并终止: 而浏览器 ...
- Linux系统软件包的管理(4)
虽然使用源码编译安装可以具有提高速度个性化的定制等优点,但对于 Linux发行商来说,则不容易管理软件包,毕竟不是每个人都会进行源码编译的,如果能够将软件预先在相同的硬体与系统上面编译好在发布的话,不 ...
- Swift 里 Set (三)Inspecting a Set
isEmpty /// A Boolean value that indicates whether the set is empty. @inlinable public var isEmpty: ...
- linux中jdk的安装与配置
一.卸载系统已有的JDK 1.查看已安装的jdk rpm -qa|grep jdk 2.卸载jdk rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1. ...
- JAVA常见安全问题复现
地址来源于乌云知识库,作者z_zz_zzz 0x01 任意文件下载 web.xml的配置: <servlet> <description></description> ...
- Shuffle(洗牌)
Shuffle(洗牌) 图 map 1.Map Task的输出k v,一开始会进入溢写缓冲区中,对数据做处理,比如分区.排序等操作. 2.有几个Map Task ...
- vue教程2-03 vue计算属性的使用 computed
vue教程2-03 vue计算属性的使用 computed computed:{ b:function(){ //默认调用get return 值 } } ---------------------- ...