阻塞队列BlockingQueue的八种类型的区别

队列有界性数据结构特性

ArrayBlockingQueue

(数组阻塞队列)

有界加锁(公平锁/非公平锁、全局锁)

循环数组

(可以类比一个圆环),所有的下标在到达最大长度时自动从0继续开始

基于数组的阻塞队列,使用数组存储数据,并需要指定其长度,所以是一个有界队列

LinkedBlockingQueue

(链表阻塞队列)

有界

/无界

加锁(添加和获取独立的锁)单链表使用链表存储数据,默认是一个无界队列;也可以通过构造方法中的capacity设置最大元素数(不指定则默认是Integer.MAX_VALUE),所以也可以作为有界队列

PriorityBlockingQueue

(优先级阻塞队列)

无界加锁(只有一个锁,入队永远成功,出队会阻塞)数组(默认长度11,可扩容),底层采用的堆结构实现(二叉堆)基于优先级别的阻塞队列,只有一个锁,入队操作永远成功,而出队只有在空队列的时候才会进行线程阻塞

DelayQueue

(延迟队列)

无界加锁数组(可扩容)延迟队列,其中的元素只有到了其指定的延迟时间,才能够从队列中出队
SynchronousQueue有界无锁(CAS)队列(公平策略)、栈(非公平策略)

一种没有缓冲的队列,生产者产生的数据直接会被消费者获取并且立刻消费

公平性策略底层使用了类似队列的数据结构,非公平策略底层使用了类似栈的数据结构。SynchronousQueue的吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue

LinkedTransferQueue无界无锁(自旋+CAS)双重数据结构或双重队列链表的无界队列
LinkedBlockingDeque无界加锁双链表双向链表的无界队列,队列头部和尾部都可以添加和移除元素,多线程并发时,可以将锁的竞争对多降到一半
DelayWorkQueue无界加锁数组(初始长度16,可扩容),底层采用的堆结构实现(二叉堆)按延迟时间排序的延迟队列,执行时间距离当前时间越近的任务在队列的前面。ScheduledThreadPoolExecutor线程池的工作队列

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值