我在JDK1.7中读取了LinkedBlockingQueue源代码,无法理解该方法。
public boolean offer(E e) {
if (e == null) throw new NullPointerException();
final AtomicInteger count = this.count;
if (count.get() == capacity)
return false;
int c = -1;
Node<E> node = new Node(e);
final ReentrantLock putLock = this.putLock;
putLock.lock();
try {
if (count.get() < capacity) {
enqueue(node);
c = count.getAndIncrement();
if (c + 1 < capacity)
notFull.signal();
}
} finally {
putLock.unlock();
}
if (c == 0)
signalNotEmpty();
return c >= 0;
}
我不知道这是如何运作的。
if (c == 0)
signalNotEmpty();
如果c == 0,表示队列为空,所以我认为该方法应该是
signalEmpty();
有人可以开导我吗?感谢。
答案 0 :(得分:1)
c
初始化为
c = count.getAndIncrement();
如果在插入新节点之前队列的大小,则为其值。因此,如果插入新节点之前的大小为0,则调用signalNotEmpty()来表示队列从空到非空。