一、引言
不知道你看《Java并发编程的艺术》此书的5.6Condition接口这一节内容时,在查看BoundedQueue.java代码的时候是否有疑问:为何有两个Condition对象:
private Condition notEmpty = lock.newCondition();
private Condition notFull = lock.newCondition();
这个疑问是否来源于,既然是一个锁,为何需要两个Conditon接口来进行消费者-生产者模式下的线程管理呢?下面我先给出完整的书上源码,以及我个人对于源码的解读,其次再来回答这个问题。
二、代码分析
public class BoundedQueue<T> {
private Object[] items;
// 添加的下标,删除的下标和数组当前数量
private int addIndex, removeIndex, count;//注意默认初始值都是0
private Lock lock = new ReentrantLock();//锁结构为独占的重入锁
private Condition notEmpty = lock.newCondition();
private Condition notFull = lock.newCondition();
public BoundedQueue(int size) {
items = new Object[size];//队列的构造器
}
// 添加一个元素,如果数组满,则添加线程进入等待状态,直到有"空位"
public void add(T t) throws InterruptedException {
lock.lock();//写之前需要先获取锁资源
try {
while (count == items.length)//意味着队列已满,不能够再添加元素
notFull.await();//使当前线程进入休眠状态
items[addIndex] = t;//以下是环形队列增加元素的代码,相信我说了此为环形,你一定能够理解以下代码
if (++addIndex