Skip to content

常见阻塞队列

一、阻塞队列在线程池的作用

线程池workQueue:无空闲核心线程时,新任务进入队列排队;队列填满后,才会创建临时急救线程执行任务。

二、四种线程池常用阻塞队列

1. ArrayBlockingQueue

基于数组实现有界阻塞队列,先进先出FIFO,创建时必须指定容量上限。

2. LinkedBlockingQueue

基于单向链表实现,默认无界,也可手动指定容量变为有界队列,先进先出FIFO。

3. DelayedWorkQueue

延时优先级队列,每次出队取出队列中执行时间最早的任务,用于定时任务线程池ScheduledThreadPoolExecutor。

4. SynchronousQueue

不存储任何元素的阻塞队列,插入操作必须等待对应取出操作配对完成,相当于任务直接转交线程,不会排队。

三、ArrayBlockingQueue vs LinkedBlockingQueue 核心对比

对比维度LinkedBlockingQueueArrayBlockingQueue
容量限制默认无界,支持手动设置有界强制有界,构造必须传容量
底层结构链表节点Node固定长度数组
内存初始化懒加载,入队时新建Node初始化一次性创建全部数组节点
内存开销每次入队生成新Node,产生GC对象数组提前初始化,无频繁对象创建
锁机制头尾双锁,入队、出队可并发执行单一把全局锁,入队出队互斥阻塞

四、面试简答

  1. 问:线程池有哪些阻塞队列?答: ArrayBlockingQueue、LinkedBlockingQueue、DelayedWorkQueue、SynchronousQueue。
  2. 问:Array和Linked阻塞队列锁区别?答: LinkedBlockingQueue使用头尾两把锁,入队出队互不阻塞,并发性能更好;ArrayBlockingQueue只有一把锁,读写互斥。
  3. 问:SynchronousQueue特点?答: 不缓存任务,插入必须等待消费线程,不会堆积任务,会直接创建临时线程。
  4. 问:DelayedWorkQueue用途?答: 延时优先级队列,定时任务线程池专用,按任务执行时间排序出队。

Powered by VitePress 1.6.4 | 持续更新中