前言
ArrayBlockingQueue 是采用数组实现的有界阻塞线程安全队列。如果向已满的队列继续塞入元素,将导致当前的线程阻塞。如果向空队列获取元素,那么将导致当前线程阻塞。
ArrayBlockingQueue 继承 AbstractQueue 类,实现 BlockingQueue 和 Serializable接口,关于 AbstractQueue 和 BlockingQueue 的内容可以参考 抽象队列与阻塞队列解析
1 | public class ArrayBlockingQueue<E> extends AbstractQueue<E> |

ArrayBlockingQueue 有两个内部类,分别为 Itrs 和 Itr。其中 Itrs 内部类 Node 继承 WeakReference 类。Itr 实现了 Iterator 接口
使用示例
实现简单的生产者消费者模型:
1 | public class ArrayBlockingQueueTest { |
其中一次执行结果如下:
1 | Thread-4 provider : Food {name:Apple} |
类结构源码分析
类属性
可重入锁的内容可以参考 ReentrantLock解析
1 | /** 存放队列元素的数组 */ |
构造器
构造器有三种
1 | // 初始化阻塞队列容量,默认是采用不公平重入锁 |
内部类源码分析
Itrs内部类
1 | class Itrs { |
Itr 内部类
1 | private class Itr implements Iterator<E> { |
进入detach模式的关键有3种情况:
- cursor == putIndex,这时候 cursor = NONE
- 空队列
- cycle - preCycles > 1
常用操作源码分析
入队
1 | // 调用抽象队列的 add 方法 |
出队
1 | // 遍历并移除队列头部元素,不感知中断 |
转数组
1 | // 将队列转成 Object 数组 |
其他操作
1 | // 获取阻塞队列元素数量 |
特殊方法
将队列元素添加到集合
1 | // 将队列元素添加到集合 c,最大数量为 Integer.MAX_VALUE |
出队与入队
1 | // 入队 |
分割迭代器
1 | // jdk8新增,可用来并行遍历元素的一个迭代器 |
总结
ArrayBlockingQueue 采用数组实现的有界阻塞线程安全队列,是规定大小的 BlockingQueue,其构造必须指定大小。其所含的对象是 FIFO 顺序排序的。