转载请注明源出处: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. java @option之args4j

    args4j简介 args4j是一个用来配置命令行的工具. 在实际的项目中用到命令行的并不是很常见,但当真正使用到时,特别是在程序启动时配置一下参数的时候就很有用了,如果参数很多的话,一个一个解析命令 ...

  2. trcd_extract_EDCD_new

    # -*- coding:utf-8 -*- import re ''' 适应新版本 ''' year='17A'#用户自定义 ss='./data/'#根目录 filename = ss+'EDCD ...

  3. GetDocument missing storage-class or type specifiers的解决方法

    error C2143: syntax error : missing ';' before '*'error C2501: 'CTest1Doc' : missing storage-class o ...

  4. Word图片上传控件(WordPaster)更新-2.0.15版本

    更新说明: 1.   增加对webp图片的支持,支持微信公众号图片的下载. 效果参考:http://www.ncmem.com/doc/view.aspx?id=9761f8ce4fe04d0ab0f ...

  5. php一些方法说明

    var_dump():判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型.此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值.数组将递归展开值,通过缩进显 ...

  6. hdu 5023 线段树+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=5023 在片段上着色,有两种操作,如下: 第一种:P a b c 把 a 片段至 b 片段的颜色都变为 c . 第 ...

  7. Android SQLiteOpenHelper Sqlite数据库的创建与打开

    Android Sqlite数据库是一个怎样的数据库? 答:是一种嵌入式小型设备,移动设备,的数据库,应用在穿戴设备(例如:智能手表,计算手环 等等),移动设备(例如:Android系统类型的手机 等 ...

  8. 梯度下降VS随机梯度下降

    样本个数m,x为n维向量.h_theta(x) = theta^t * x梯度下降需要把m个样本全部带入计算,迭代一次计算量为m*n^2 随机梯度下降每次只使用一个样本,迭代一次计算量为n^2,当m很 ...

  9. lr中错误解决方法19种

    一.Error -27727: Step download timeout (120 seconds)has expired when downloading resource(s). Set the ...

  10. Oracle Client 连接 Server 并通过代码测试连接

    Oracle客户端配置 步骤一: 步骤二: 步骤三: 步骤四: 步骤五: 最后测试成功   注: 如果是客户端配置可以不用添加 程序同样可以进行连接,如果是服务器则需要配置. 程序连接 namespa ...