1.主要成员变量
// 存放元素的数组
final Object[] items;
// 第一个被去除元素的下标,队头
int takeIndex;
// 下一个元素的存储下标,队尾
int putIndex;
// 队列中元素的数量
int count;
// 可重入锁
final ReentrantLock lock;
// 队列为空时,消费者线程阻塞存储
private final Condition notEmpty;
// 队列满时,生产者线程阻塞存储
private final Condition notFull;
2.构造器
// 指定容量如果小于1、等于0则报错非法参数异常
public ArrayBlockingQueue(int capacity) {
this(capacity, false);
}
// 指定容量和访问策略,默认是非公平锁
public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity <= 0)
throw new IllegalArgumentException();
this.items = new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
// 指定容量,访问策略和给定的元素
public ArrayBlockingQueue(int capacity, boolean fair,
Collection<? extends E> c) {
this(capacity, fair);
final ReentrantLock lock = this.lock;
lock.lock(); // Lock only for visibility, not mutual exclusion
try {
int i = 0;
try {
for (E e : c) {
checkNotNull(e);
items[i++] = e;
}
} catch (ArrayIndexOutOfBoundsException ex) {
throw new IllegalArgumentException();
}
count = i;
putIndex = (i == capacity) ? 0 : i;
} finally {
lock.unlock();
}
}
3.入队操作put()方法
public void put(E e) throws InterruptedException {
// 检测元素是否为空
checkNotNull(e);
final ReentrantLock lock = this.lock;
// 可中断的等待获取锁,获取不到锁就在锁的同步队列中等待,同时响应中断
lock.lockInterruptibly();
try {
// 队列满则等待元素被取出
while (count == items.length)
notFull.await();
// 不满则调用enqueue()存放元素
enqueue(e);
} finally {
// 解锁
lock.unlock();
}
}
4.存放元素enqueue()方法