Java之集合(二十)LinkedBlockingQueue
转载请注明源出处:http://www.cnblogs.com/lighten/p/7503678.html
1.前言
本章介绍阻塞队列LinkedBlockingQueue,这是一个基于链表的可选长度的队列,符合链表的先入先出规则。基于链表的队列通常比基于数组的队列有更高的吞吐量,但是在大多数的并发应用中并不能这么预测。可选容量默认大小是Integer.MAX_VALUE.
2.LinkedBlockingQueue
2.1 数据结构

这个结构和LinkedBlockingDeque相似,不过put和take操作使用了不同的锁进行,因为是单向的链表,存取可以相互不影响,存取锁可以增加吞吐量。还多了一个count原子类计数。

头尾节点都使用了同一个值为null的结点,一般队列都会使用null来判断,所以队列一般都不允许出现空的元素,会干扰判断。
2.2 基本操作
放入一个元素:


判断容量,够就加锁,还需要判断一次容量,因为是加锁之前判断的容量,而且这个时候c=-1,没有抢到锁后入如果容量超过,也不会修改c的值,结果依旧没问题。再次判断容量之后就入链表,计数加1,容量没满就发出未满信号,通知等待存入的队列。入队列很简单,就是last设置下一个节点,再把该节点设置成last。最后如果之前的容量是0,则通知等待取出的线程队列不为空。
取出一个元素:


和offer的原理相同,换成了入队列而已。出队列可以看出,其不是直接删除头结点,因为初始化的时候头结点是一个值为null的结点,所以后面其为了保持这个null标志的头结点,出队列先去掉之前的头结点,在将第一个元素结点设置成头结点,返回其内容,设置内容为null,形成新的null标志的头结点。
其它的方法就不再介绍,满足队列接口的相关定义,操作原理也很简单。例子也不需要给出了,简单的队列操作而已。
Java之集合(二十)LinkedBlockingQueue的更多相关文章
- Java之集合(二十六)ConcurrentSkipListMap
转载请注明源出处:http://www.cnblogs.com/lighten/p/7542578.html 1.前言 一个可伸缩的并发实现,这个map实现了排序功能,默认使用的是对象自身的compa ...
- Java之集合(二十四)ConcurrentLinkedDeque
转载请注明源出处:http://www.cnblogs.com/lighten/p/7517454.html 1.前言 本章介绍并发队列ConcurrentLinkedDeque,这是一个非阻塞,无锁 ...
- Java之集合(二十二)PriorityBlockingQueue
转载请注明源出处:http://www.cnblogs.com/lighten/p/7510799.html 1.前言 本章介绍阻塞队列PriorityBlockingQueue.这是一个无界有序的阻 ...
- Java之集合(二十五)ConcurrentHashMap
转载请注明源出处:http://www.cnblogs.com/lighten/p/7520808.html 1.前言 本章介绍使用的最频繁的并发集合类之一ConcurrentHashMap,之前介绍 ...
- Java IO(二十) PrintStream 和 DataOutputStream 异同
Java IO(二十) PrintStream 和 DataOutputStream 异同 一.相同点 都是继承与FileOutputStream,用于包装其它输出流. 二.不同点 (一).Print ...
- Java从零开始学二十四(集合工具类Collections)
一.Collections简介 在集合的应用开发中,集合的若干接口和若干个子类是最最常使用的,但是在JDK中提供了一种集合操作的工具类 —— Collections,可以直接通过此类方便的操作集合 二 ...
- Java开发学习(二十五)----使用PostMan完成不同类型参数传递
一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...
- Java开发学习(二十六)----SpringMVC返回响应结果
SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...
- Java并发(二十二):定时任务ScheduledThreadPoolExecutor
需要在理解线程池原理的基础上学习定时任务:Java并发(二十一):线程池实现原理 一.先做总结 通过一个简单示例总结: public static void main(String[] args) { ...
随机推荐
- HDU 3177 Crixalis's Equipment (贪心,差值)
题意:判断 n 件物品是否可以搬进洞里,每件物品有实际体积A和移动时的额外体积 B . 析:第一反应就是贪心,一想是不是按B从大到小,然后一想,不对,比如体积是20,第一个 是A=11, B=19.第 ...
- (KMP 水)Wow! Such Doge! -- hdu -- 4847
http://acm.hdu.edu.cn/showproblem.php?pid=4847 Wow! Such Doge! Time Limit:1000MS Memory Limit:32 ...
- BUG_vector iterator not dereferencable
1问题: bug提示图下图所示:
- codevs 1012
题目描述 Description 给出n和n个整数,希望你从小到大给他们排序 输入描述 Input Description 第一行一个正整数n 第二行n个用空格隔开的整数 输出描述 Output De ...
- TCP/IP协议族分层
协议族的分层抽象,一定意义上来说,每层敬职敬责的做自己的工作,同时也共同完成通讯协议的共同目标. 这是一个垂直划分的抽象层次,挺有意义. 1.链路层/数据链路层/网络接口层 操作系统中的设备驱动程序和 ...
- 一起学习MVC(4)Controllers的学习
控制器Controllers Controllers为控制器文档,AccountControllers内的方法对应View→Account下的cshtml文件. 我们看到Aco ...
- linux系统编程之文件与IO(八):文件描述符相关操作-dup,dup2,fcntl
本节目标: 1,文件共享 打开文件内核数据结构 一个进程两次打开同一个文件 两个进程打开同一个文件 2,复制文件描述符(dup.dup2.fcntl) 一,文件共享 1,一个进程打开两个文件内核数据结 ...
- 设计模式之代理模式(Proxy Pattern)_远程代理解析
一.什么是代理模式? 顾名思义,代理就是第三方,比如明星的经纪人,明星的事务都交给经纪人来处理,明星只要告诉经纪人去做什么,经纪人自然会想办法去做,做完之后再把结果告诉明星就好了 本来是调用者与被调用 ...
- 深入理解Aspnet Core之Identity(3)
主题 账户管理一个比较常见的功能就是密码强度策略,Identity已经内置了一个通用的可配置的策略,我们一般情况下可以直接拿来用即可.本篇我会介绍一些Identity内置的密码策略类:Password ...
- .NET Core中使用Dapper操作Oracle存储过程最佳实践
为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...