java jdk 1.7中的LinkedBlockingQueue

时间:2015-08-01 07:22:24

标签: java concurrency

我在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();

有人可以开导我吗?感谢。

1 个答案:

答案 0 :(得分:1)

c初始化为

c = count.getAndIncrement();

如果在插入新节点之前队列的大小,则为其值。因此,如果插入新节点之前的大小为0,则调用signalNotEmpty()来表示队列从非空