掌握并发包下的队列

说到队列尤其是阻塞队列,不得不说jdk的并发包(Java.util.concurrent)中的相关数据结构,今天我们就来对java(JDK1.7)中的队列做一个总结。

1、Queue

队列接口,定义了队列基本的接口方法

这里写图片描述

前两个方法是往队列塞数据,在队列空间不足的情况下add会抛出异常,而offer会返回false。poll和peek的区别是后者不会从队列中移除元素。

2、BlockingQueue、BlockingDequeue(阻塞队列、双向阻塞队列)

这里写图片描述

BlockingQueue扩展Queue的方法,使其在在队列已满的情况下添加元素时有了4种模式:其一,抛异常;其二,立即返回false;其三,等待;其四,等待一段时间。除此之外还增加了drainTo接口用于追加其它集合的元素到队尾

3、ArrayBlockingQueue、LinkedBlockingQueue

这里写图片描述

这里写图片描述

两者直接的最重要的区别就是前者使用了数组来存储元素,而后者使用Node(链式结构)来存储元素,其它方法和它们的父类差不多。inc和dec方法是用来检查边界的。此外按照集合类的惯例提供了一个迭代器内部类同时LinkedBlockingQueue还提供了一个从对象流中读写对象的方法。

4、TransferQueue、LinkedTransferQueue

这里写图片描述

这两个类比类似的集合类多了个Transfer的功能,这个功能会通过tryTransfer方法和transfer方法直接投递元素,而不会放入队列,区别在于前者如果没有对应等待的消费者会直接返回false后者会等待到消费者拿取元素。

5、PriorityBlockingQueue

这里写图片描述

值得提醒的一点是如果要保证这个Queue是按优先级来排列元素的,必须自己实现元素的CompareTo方法达到目的。

6、DelayedQueue

这个队列没太多可以介绍,它增加的功能就是能为元素设置一个失效时间,失效后才能被从队列中取出来。

7、SychronousQueue

这里写图片描述

这个队列的用处就是它只能有一个元素,取一个塞一个。

8、ConcurrentLinkedQueue和ConcurrentLinkedDeque

这里写图片描述

前面提到的queue都是非线程安全的queue,ConcurrentLinkedQueue是线程安全的类。那么问题来了,它是怎么实现线程安全的呢?首先它的head和tail节点都是使用关键字volatile保证了内存可见性,其次,阻塞队列使用了锁来实现阻塞功能,而并发阻塞队列的入队和出队操作使用CAS操作实现无所编程来达到同样目的,效率更高。

猜你喜欢

转载自blog.csdn.net/qq_39326137/article/details/82766771
今日推荐