在了解LinkedBlockingQueue之前,请先了解GuardedBlocks public void put ( E e ) throws InterruptedException { if ( e == null ) { throw new NullPointerException (); } final int c ; final Node E node = new Node E ( e ); final Reentrant
在了解LinkedBlockingQueue之前,请先了解GuardedBlocks
public void put(E e) throws InterruptedException {if (e == null) {
throw new NullPointerException();
}
final int c;
final Node<E> node = new Node<E>(e);
final ReentrantLock putLock = this.putLock;
final AtomicInteger count = this.count;
putLock.lockInterruptibly();
try {
while (count.get() == capacity) {
notFull.await();
}
enqueue(node);
c = count.getAndIncrement();
if (c + 1 < capacity)
notFull.signal();
} finally {
putLock.unlock();
}
if (c == 0)
signalNotEmpty();
}