1 概述
ArrayBlockingQueue(简称ABQ)是BlockingQueue接口的实现类,是一种有界界、阻塞、线程安全的FIFO队列。ABQ底层存储基于数组,因此需要在初始化时候指定数组容量。相对基于链表实现的阻塞队列LinkedBlockingQueue(简称LBQ),ABQ队列中元素的入队和出队都是使用同一把锁来保证线程安全,实现更加简单。
2 构造函数
//capacity是数组容量
public ArrayBlockingQueue(int capacity) {
//默认是使用非公平锁
this(capacity, false);
}
public ArrayBlockingQueue(int capacity, boolean fair) {
//初始容量必须大于0
if (capacity <= 0)
throw new IllegalArgumentException();
//items为全局变量,表示存储元素的数组
this.items = new Object[capacity];
//fail位true表示公平锁;false表示非公平锁
lock = new ReentrantLock(fair);
//取出的对象监听器
notEmpty = lock.newCondition();
//添加的对象监听器
notFull = lock.newCondition();
}
3 阻塞式新增操作(put方法)
public void put(E e) throws InterruptedException {
//非空检查
checkNotNull(e);
final ReentrantLock lock = this.lock;
//上锁
//响应中断
lock.lockInterruptibly();
try {
//count为全局变量,表示数组中存储元素的真实数量
//count==items.length,说明数组已满,线程进入阻塞状态
while (count == items.length)
//线程阻塞,释放锁
//线程被唤醒后,会重新获得锁
notFull.await();
//count!=items.length,说明数组未满,可以继续添加到队列中
enqueue(e);
} finally {
//释放锁
lock.unlock();
}
}
private void enqueue