ArrayBlockingQueue - действительно ли это Concurrent?

Ни одна операция ArrayBlockingQueue не выполняется параллельно ни с одной из других его операций; они всегда берут один и тот же замок. Даже для метода size() требуется блокировка.

 public int size() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }

Пока для реализации LinkedBlockingQueue у вас две блокировки: поставить и взять. А для size() используется AtomicInteger, поэтому блокировка не нужна.

Итак, мой вопрос: почему эта реализация в параллельном пакете - действительно ли ArrayBlockingQueue параллельна?


person veritas    schedule 10.07.2013    source источник
comment
Его можно использовать в параллельной настройке --- в этом суть.   -  person Marko Topolnik    schedule 10.07.2013


Ответы (1)


ArrayBlockingQueue находится в java.util.concurrent package, потому что несколько потоков могут одновременно использовать объект без проблем с потокобезопасностью.

Возможность использовать несколько методов одновременно — это не то, для чего создан объект.

person Duncan Jones    schedule 10.07.2013
comment
Я бы добавил, что пакет concurrent представляет собой набор утилит для создания параллельных приложений. все утилиты потокобезопасны. Некоторые из них более внутренне параллельны, чем другие. - person jtahlborn; 10.07.2013