java消息队列解析,技术连载数据结构
java消息队列解析,技术连载数据结构其中blockingQueue的主要特点是在队列为空时,出队列操作会阻塞,直到有元素进来;在队列满了之后,入队操作会阻塞,直到有空闲位置。实现这个接口的三个子接口是:BlockingQueue<E> Deque<E> and BlockingDeque<E>.首先看一下java中有哪些与队列相关的类以及它们之间的继承关系时怎么样的。类继承关系从上图来看,根元素是:Queue,这个接口定义了队列的基本操作,里面仅仅包含5个方法,如下图所示:
这里先抛出两个问题:
优先级队列是使用什么数据结构实现的呢?底层的存储用的是数组还是链表?
ArrayBlockingqueue是如何保证并发环境下不出问题的,具体的实现机制是怎样的?
读完本章,你将会有答案;
java中的队列体系首先看一下java中有哪些与队列相关的类以及它们之间的继承关系时怎么样的。
类继承关系
从上图来看,根元素是:Queue,这个接口定义了队列的基本操作,里面仅仅包含5个方法,如下图所示:
实现这个接口的三个子接口是:BlockingQueue<E> Deque<E> and BlockingDeque<E>.
其中blockingQueue的主要特点是在队列为空时,出队列操作会阻塞,直到有元素进来;在队列满了之后,入队操作会阻塞,直到有空闲位置。
队列的抽象类:AbstractQueue
队列的实现主要有以下几个类:
- LinkedList<E>
- ArrayDeque<E>
- PriorityQueue<E>
- DelayQueue<E extends Delayed>
- ArrayBlockingQueue<E>
- LinkedBlockingQueue<E>
- LinkedBlockingDeque<E>
- PriorityBlockingQueue<E>
- ConcurrentLinkedQueue<E>
- ConcurrentLinkedDeque<E>
- SynchronousQueue<E>
其中前面三个在util包下面,不支持并发编程,后面的在concurrent包下面,支持并发编程的;
重点说一下delayQueue,这个队列的特点是元素出队列时必须满足一定的时间条件限制。
其余队列特点通过名字很好总结;
队列分析应该关注的点关于队列的分析,主要应该关注以下两点:
- 是否有界
- 是否支持并发
PriorityQueue:
无边界的,基于堆这种数据结构来实现的,堆的存储方式选用的是数组;
transient Object[] queue; // non-private to simplify nested class access
关于堆这种数据结构将在后面的文章中分析;
ArrayBlockingQueue
并发是如何实现的呢?这里需要注意的是,并不是所有的方法都支持并发,比如add方法,实际上是Collection接口的实现,并不支持并发,offer是Queue接口中的方法实现,也不支持并发;
只有继承自BlockingQueue接口的方法才支持并发编程;
以put为例:
很明显,是通过重入锁ReentrantLock实现的;
技术连载:开篇词
技术连载:连载提纲设计思路
技术连载:数据结构 - 数组
技术连载:数据结构 - 数组常见面试题汇总
技术连载:数据结构 - 链表
技术连载:数据结构 - 链表相关的高频面试题汇总
技术连载:数据结构 - 栈
技术连载:数据结构 - 栈在面试中的应用
技术连载:数据结构 - 队列及其变种(循环、双端、阻塞、并发)