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 ...
随机推荐
- matplotlib可视化之如何给图形添加数据标签?
当我们获取完数据之后,一般来说数据可视化呈现的最基础图形就是:柱状图.水平条形图.折线图等等,在python的matplotlib库中分别可用bar.barh.plot函数来构建它们,再使用xtick ...
- 【转】C#如何创建泛型类T的实例
原文地址:https://www.cnblogs.com/lxhbky/p/6020612.html 最近在学历基类的写法时,遇到了一个问题:如何怎么创建一个泛型类T的实例呢? 废话不多说了, ...
- 组件基础(参数校验和动态组件、v-once)—Vue学习笔记
最最最后一点关于组件传值的问题. 提醒:本篇内容请使用Vue.js开发版!(附带完成的警告和提示) 1.组件的参数校验 父组件向子组件传值,子组件可以决定传值的一些限制. 比如,子组件指向接收Stri ...
- d3.js在vue项目中的安装及案例
1. 安装: npm i d3 --save 2. 引入:main.js import * as d3 from "d3"; Vue.prototype.$d3 = d3; win ...
- Linux玩转redis从入门到放肆--1.缓存击穿
1. 缓存穿透在大多数互联网应用中,缓存的使用方式如下图所示: 1.当业务系统发起某一个查询请求时,首先判断缓存中是否有该数据:2.如果缓存中存在,则直接返回数据:3.如果缓存中不存在,则再查询数据库 ...
- [0day]微软XP系统右键菜单任意DLL却持
作者:K8哥哥只要在DLL上右键就被却持 任意DLL名称 任意位置 (其实是EXPLOR) 这个漏洞早已存在,08年的时候就发现了(当时编译某个DLL源码) 在DLL上右键看属性的时候崩溃了,当时就想 ...
- 【并发】1、关于线程的几种状态&关于yield的理解
最近在看disruptor源码,在获取ringbuffer的下一个序列的时候,disruptor有几种等待策略,其中有YieldingWaitStrategy类,是使用java的Thread.yiel ...
- alembic教程
安装 pip install alembic 步骤 1.初始化 alembic 仓库 在终端中, cd 到你的项目目录中,然后执行命令 alembic init alembic ,创建一个名叫 ale ...
- 8 Ways to Become a Better Coder
It’s time to get serious about improving your programming skills. Let’s do it! That’s an easy career ...
- 深入聊聊Java多线程
一.背景 在没有学习Java多线程以前,总觉得多线程是个很神秘的东西,只有那些大神才能驾驭,新年假期没事就来学习和了解一下Java的多线程,本篇博客我们就来从头说一下多线程到底是怎么回事. 二.概述 ...