Ни одна операция ArrayBlockingQueue
не выполняется параллельно ни с одной из других его операций; они всегда берут один и тот же замок. Даже для метода size()
требуется блокировка.
public int size() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return count;
} finally {
lock.unlock();
}
}
Пока для реализации LinkedBlockingQueue
у вас две блокировки: поставить и взять. А для size()
используется AtomicInteger
, поэтому блокировка не нужна.
Итак, мой вопрос: почему эта реализация в параллельном пакете - действительно ли ArrayBlockingQueue
параллельна?