队列 | 有界性 | 锁 | 数据结构 | 特性 |
ArrayBlockingQueue (数组阻塞队列) | 有界 | 加锁(公平锁/非公平锁、全局锁) | 循环数组 (可以类比一个圆环),所有的下标在到达最大长度时自动从0继续开始 | 基于数组的阻塞队列,使用数组存储数据,并需要指定其长度,所以是一个有界队列 |
LinkedBlockingQueue (链表阻塞队列) | 有界 /无界 | 加锁(添加和获取独立的锁) | 单链表 | 使用链表存储数据,默认是一个无界队列;也可以通过构造方法中的capacity 设置最大元素数(不指定则默认是Integer.MAX_VALUE),所以也可以作为有界队列 |
PriorityBlockingQueue (优先级阻塞队列) | 无界 | 加锁(只有一个锁,入队永远成功,出队会阻塞) | 数组(默认长度11,可扩容),底层采用的堆结构实现(二叉堆) | 基于优先级别的阻塞队列,只有一个锁,入队操作永远成功,而出队只有在空队列的时候才会进行线程阻塞 |
DelayQueue (延迟队列) | 无界 | 加锁 | 数组(可扩容) | 延迟队列,其中的元素只有到了其指定的延迟时间,才能够从队列中出队 |
SynchronousQueue | 有界 | 无锁(CAS) | 队列(公平策略)、栈(非公平策略) | 一种没有缓冲的队列,生产者产生的数据直接会被消费者获取并且立刻消费 公平性策略底层使用了类似队列的数据结构,非公平策略底层使用了类似栈的数据结构。SynchronousQueue的吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue |
LinkedTransferQueue | 无界 | 无锁(自旋+CAS) | 双重数据结构或双重队列 | 链表的无界队列 |
LinkedBlockingDeque | 无界 | 加锁 | 双链表 | 双向链表的无界队列,队列头部和尾部都可以添加和移除元素,多线程并发时,可以将锁的竞争对多降到一半 |
DelayWorkQueue | 无界 | 加锁 | 数组(初始长度16,可扩容),底层采用的堆结构实现(二叉堆) | 按延迟时间排序的延迟队列,执行时间距离当前时间越近的任务在队列的前面。ScheduledThreadPoolExecutor线程池的工作队列 |
08-15
7762