0%

BlockingQueue 子类篇

在读BlockingQueue源码–ArrayBlockingQueue(上篇)中有说过, 有想法后面将 BlockingQueue的众多子类都总结一遍,后面看了下,工程量好像有点大.

总结还是要总结的,食言是不可能食言的.

鉴于全部总结,需要工程浩大,所以我准备只研究其子类的特点.说干就干.

all

这里我们依旧还是只打算总结前面说过的几个子类.

  • ArrayBlockingQueue : 基于数组存储结构的阻塞有界队列
  • LinkedBlockingQueue: 基于链表的阻塞队列
  • LinkedBlockingDeque: 基于双链表的阻塞队列
  • DelayedWorkQueue: 支持延时的阻塞队列
  • PriorityBlockingQueue: 支持优先级的阻塞队列

ArrayBlockingQueue

  • 一个锁, 不支持同时读写操作
  • 两个条件队列
  • 有界,可选有界,不支持扩容
  • 底层数据存储结构是数组

LinkedBlockingQueue

  • 2个锁 ( 读锁 , 写锁 ), 支持同时读写操作
  • 两个条件队列,分别对应两个锁
  • 有界,可选有界
  • 底层数据存储结构是 单链表
  • 通过一个原子类count 来确定队列元素个数

LinkedBlockingDeque

  • 1个锁 , 不支持同时读写操作
  • 两个条件队列
  • 有界,可选有界
  • 底层数据存储结构是 双链表
  • 通过一个原子类count 来确定队列元素个数

DelayedWorkQueue

DelayedWorkQueue 是ScheduledThreadPoolExecutor 的一个内部类.

  • 1个锁 , 不支持同时读写操作
  • 1个条件队列
  • 底层数据存储结构是 数组, 支持扩容, 逻辑结构是 Min Heap

PriorityBlockingQueue

  • 1个锁 , 不支持同时读写操作
  • 1个条件队列(出队有排序,不需要管)
  • 底层数据存储结构是数组, 支持扩容
  • 有一个Comparator实例,用于比较优先级

心得

只需要搞清楚了ReentrantLock ,以及BlockingQueue 众子类中的一种,其他的子类也很好理解.

重点的 AQS , 条件队列唤醒机制 都是一样的.