转载请注明源出处: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的更多相关文章

  1. Java之集合(二十六)ConcurrentSkipListMap

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7542578.html 1.前言 一个可伸缩的并发实现,这个map实现了排序功能,默认使用的是对象自身的compa ...

  2. Java之集合(二十四)ConcurrentLinkedDeque

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7517454.html 1.前言 本章介绍并发队列ConcurrentLinkedDeque,这是一个非阻塞,无锁 ...

  3. Java之集合(二十二)PriorityBlockingQueue

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7510799.html 1.前言 本章介绍阻塞队列PriorityBlockingQueue.这是一个无界有序的阻 ...

  4. Java之集合(二十五)ConcurrentHashMap

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7520808.html 1.前言 本章介绍使用的最频繁的并发集合类之一ConcurrentHashMap,之前介绍 ...

  5. Java IO(二十) PrintStream 和 DataOutputStream 异同

    Java IO(二十) PrintStream 和 DataOutputStream 异同 一.相同点 都是继承与FileOutputStream,用于包装其它输出流. 二.不同点 (一).Print ...

  6. Java从零开始学二十四(集合工具类Collections)

    一.Collections简介 在集合的应用开发中,集合的若干接口和若干个子类是最最常使用的,但是在JDK中提供了一种集合操作的工具类 —— Collections,可以直接通过此类方便的操作集合 二 ...

  7. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

  8. Java开发学习(二十六)----SpringMVC返回响应结果

    SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...

  9. Java并发(二十二):定时任务ScheduledThreadPoolExecutor

    需要在理解线程池原理的基础上学习定时任务:Java并发(二十一):线程池实现原理 一.先做总结 通过一个简单示例总结: public static void main(String[] args) { ...

随机推荐

  1. HDU 3177 Crixalis's Equipment (贪心,差值)

    题意:判断 n 件物品是否可以搬进洞里,每件物品有实际体积A和移动时的额外体积 B . 析:第一反应就是贪心,一想是不是按B从大到小,然后一想,不对,比如体积是20,第一个 是A=11, B=19.第 ...

  2. (KMP 水)Wow! Such Doge! -- hdu -- 4847

    http://acm.hdu.edu.cn/showproblem.php?pid=4847 Wow! Such Doge! Time Limit:1000MS     Memory Limit:32 ...

  3. BUG_vector iterator not dereferencable

    1问题: bug提示图下图所示:

  4. codevs 1012

    题目描述 Description 给出n和n个整数,希望你从小到大给他们排序 输入描述 Input Description 第一行一个正整数n 第二行n个用空格隔开的整数 输出描述 Output De ...

  5. TCP/IP协议族分层

    协议族的分层抽象,一定意义上来说,每层敬职敬责的做自己的工作,同时也共同完成通讯协议的共同目标. 这是一个垂直划分的抽象层次,挺有意义. 1.链路层/数据链路层/网络接口层 操作系统中的设备驱动程序和 ...

  6. 一起学习MVC(4)Controllers的学习

                控制器Controllers Controllers为控制器文档,AccountControllers内的方法对应View→Account下的cshtml文件. 我们看到Aco ...

  7. linux系统编程之文件与IO(八):文件描述符相关操作-dup,dup2,fcntl

    本节目标: 1,文件共享 打开文件内核数据结构 一个进程两次打开同一个文件 两个进程打开同一个文件 2,复制文件描述符(dup.dup2.fcntl) 一,文件共享 1,一个进程打开两个文件内核数据结 ...

  8. 设计模式之代理模式(Proxy Pattern)_远程代理解析

    一.什么是代理模式? 顾名思义,代理就是第三方,比如明星的经纪人,明星的事务都交给经纪人来处理,明星只要告诉经纪人去做什么,经纪人自然会想办法去做,做完之后再把结果告诉明星就好了 本来是调用者与被调用 ...

  9. 深入理解Aspnet Core之Identity(3)

    主题 账户管理一个比较常见的功能就是密码强度策略,Identity已经内置了一个通用的可配置的策略,我们一般情况下可以直接拿来用即可.本篇我会介绍一些Identity内置的密码策略类:Password ...

  10. .NET Core中使用Dapper操作Oracle存储过程最佳实践

    为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...