在读BlockingQueue源码–ArrayBlockingQueue(上篇)中有说过, 有想法后面将 BlockingQueue的众多子类都总结一遍,后面看了下,工程量好像有点大.
总结还是要总结的,食言是不可能食言的.
鉴于全部总结,需要工程浩大,所以我准备只研究其子类的特点.说干就干.
这里我们依旧还是只打算总结前面说过的几个子类.
- 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 , 条件队列唤醒机制 都是一样的.