Java之集合(二十)LinkedBlockingQueue
2017-09-11 10:17
344 查看
转载请注明源出处:http://www.cnblogs.com/lighten/p/7503678.html
这个结构和LinkedBlockingDeque相似,不过put和take操作使用了不同的锁进行,因为是单向的链表,存取可以相互不影响,存取锁可以增加吞吐量。还多了一个count原子类计数。
头尾节点都使用了同一个值为null的结点,一般队列都会使用null来判断,所以队列一般都不允许出现空的元素,会干扰判断。
判断容量,够就加锁,还需要判断一次容量,因为是加锁之前判断的容量,而且这个时候c=-1,没有抢到锁后入如果容量超过,也不会修改c的值,结果依旧没问题。再次判断容量之后就入链表,计数加1,容量没满就发出未满信号,通知等待存入的队列。入队列很简单,就是last设置下一个节点,再把该节点设置成last。最后如果之前的容量是0,则通知等待取出的线程队列不为空。
取出一个元素:
和offer的原理相同,换成了入队列而已。出队列可以看出,其不是直接删除头结点,因为初始化的时候头结点是一个值为null的结点,所以后面其为了保持这个null标志的头结点,出队列先去掉之前的头结点,在将第一个元素结点设置成头结点,返回其内容,设置内容为null,形成新的null标志的头结点。
其它的方法就不再介绍,满足队列接口的相关定义,操作原理也很简单。例子也不需要给出了,简单的队列操作而已。
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多线程系列--“JUC集合”08之 LinkedBlockingQueue
- Java并发集合——ArrayBlockingQueue ,LinkedBlockingQueue,ConcurrentHashMap
- Java集合源码学习(17)_BlockingQueue接口的实现LinkedBlockingQueue
- java-并发集合-阻塞队列 LinkedBlockingQueue 演示
- Java集合, LinkedBlockingQueue源码解析(常用于并发编程)
- Java多线程系列--“JUC集合”09之 LinkedBlockingDeque
- Java常用的2种阻塞队列ArrayBlockingQueue和LinkedBlockingQueue
- java 集合 Vector ArrayList LinkedList
- Java集合---LinkedList源码解析
- 从源码分析java集合【LinkedList】
- java 集合 之 链表和线性表以及ArrayList的各方法的介绍及示例 及 ArrayList与LinkedList的区别分析 及 ArrayList与Array(数组)的区别
- 黑马程序员---2015.6.20java基础笔记---集合类--ArrayList---LinkedList---HashSet
- Java集合之LinkedHashSet
- Java多线程系列--【JUC集合10】- ConcurrentLinkedQueue
- Java集合源码学习(11)_Set接口的实现LinkedHashSet
- Java 集合深入理解(11):LinkedList
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
- java例题学习:LinkedList模拟栈数据结构的集合
- 【Java】LinkedBlockingQueue、PriorityQueue and ConcurrentLinkedQueue