其他分享
首页 > 其他分享> > JUC------阻塞队列

JUC------阻塞队列

作者:互联网

文章预览

前言

阻塞队列BlockingQueue是一个支持两个附加操作的队列。提供了一些阻塞方法,主要作用是:

1) 支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。

2) 支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。

阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列是生存者用来存放元素,消费者用来获取元素的容器。
在这里插入图片描述

一、阻塞队列类型

DK提供了7种阻塞队列。如下:

1.1、ArrayBlockingQueue

ArrayBlockingQueue是一个用数组实现的有界阻塞队列,在初始化构造的时候需要***指定队列的容量***。此队列按照先进先出(FIFO)的原则对元素进行排序。
具有如下特点:

1.2、LinkedBlockingQueue

LinkedBlockingQueue是一个用***链表***实现的***有界阻塞队列***。此队列的默认和***最大长度***是Integer.MAX_VALUE。此队列按照***先进先出***(FIFO)的原则对元素进行排序。

LinkedBlockingQueue除了底层***数据结构是单链表***与ArrayBlockingQueue不同外,另外一个特点就是:它维护了两把锁——takeLockputLock

takeLock用于控制出队的并发,putLock用于控制入队的并发。

这也就意味着,同一时刻,只能只有一个线程能执行入队/出队操作,其余入队/出队线程会被阻塞; 但是,入队和出队之间可以并发执行,即同一时刻,可以同时有一个线程进行入队,另一个线程进行出队,这样就可以提升吞吐量。
***LinkedBlockingQueue***和***ArrayBlockingQueue***比较主要有以下区别:

1.3、PriorityBlockingQueue

PriorityBlockingQueue是一个支持优先级的***无界阻塞队列***。默认情况下元素采用自然顺序升序排列。在构造的时候可以指定队列的初始容量。

1.4、SynchronousQueue

SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。

它支持公平访问队列。默认情况下线程采用非公平性策略访问队列。通过构造入参创建公平性访问的SynchronousQueue,如果设为true,则等待的线程会采用先进先出的顺序访问队列。

SynchronousQueue的底层实现包含两种数据结构——栈和队列。这是一种非常特殊的阻塞队列。

特点简要概述如下:

1.5、DelayQueue

DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。

DelayQueue非常有用,可以将DelayQueue运用在以下应用场景

它的特点:

1.6、LinkedBlockingDeque

LinkedBlockingDeque是一个由链表结构组成的双向阻塞队列。

和ConcurrentLinkedDeque类似,都是一种双端队列的结构,只不过LinkedBlockingDeque同时也是一种阻塞队列。

LinkedBlockingDeque底层利用ReentrantLock实现同步,并不像ConcurrentLinkedDeque那样采用***无锁算法***。

1.7、LinkedTransferQueue

LinkedTransferQueue一种比较***特殊***的阻塞队列。

我们知道,在普通阻塞队列中,当队列为空时,消费者线程(调用take或poll方法的线程)一般会阻塞等待生产者线程往队列中存入元素。而LinkedTransferQueue的transfer方法则比较特殊:

LinkedTransferQueue的特点简要概括如下:

LinkedTransferQueue兼具了SynchronousQueue的特性以及无锁算法的性能,并且是一种无界队列:

和SynchronousQueue相比,LinkedTransferQueue可以存储实际的数据;

和其它阻塞队列相比,LinkedTransferQueue直接用无锁算法实现,性能有所提升。

二、ArrayBlockingQueue常用方法

增加值的方法:

取值的方法:

三、LinkedBlockingQueue 常用方法

标签:JUC,队列,元素,LinkedBlockingQueue,阻塞,入队,线程,------
来源: https://blog.csdn.net/niulinbiao/article/details/122638981