该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
public void put(E e) throws InterruptedException {
//不允许元素为null
if (e == null) throw new NullPointerException();
int c = -1;
//以当前元素新建一个节点
Node node = new Node(e);
final ReentrantLock putLock = this.putLock;
final AtomicInteger count = this.count;
//获得入队的锁
putLock.lockInterruptibly();
try { //如果队列已满,那么将该线程加入到Condition的等待队列中
while (count.get() == capacity) {
notFull.await();
}
//将节点入队
enqueue(node);
//得到插入之前队列的元素个数
c = count.getAndIncrement();
//如果还可以插入元素,那么释放等待的入队线程
if (c + 1 < capacity)
notFull.signal();
} finally {
//解锁
putLock.unlock();
}
//通知出队线程队列非空
if (c == 0)
signalNotEmpty();
}
这里面 这段代码有点不理解:
if (c + 1 < capacity)
notFull.signal();
我觉得完全没必要啊,插入一个唤醒一个不就够了吗?啥时候这段代码才会起作用呢?