BlockingQueue нужно синхронизировать? [Дубликат]

1

не могли бы вы помочь мне? Является ли это необходимым для BlockingQueue, когда я хочу быть уверенным, что только один поток изменяет очередь?:

BlockingQueue queue = new ArrayBlockingQueue (1024);

Коллекции = Collections.synchronizedCollection (очередь); <--- это необходимо?

  • 0
    В соответствии с документацией говорится, что BlockingQueue можно безопасно использовать с несколькими производителями и несколькими потребителями. и снова реализации BlockingQueue являются поточно-ориентированными. Все методы очередей достигают своих эффектов атомарно, используя внутренние блокировки или другие формы управления параллелизмом.
Теги:

3 ответа

1

Поскольку BlockingQueue является потокобезопасным, вам не нужно синхронизировать его обращения: параллелизм обрабатывается самим классом.

В блоке BlockingQueue javadoc указано:

Реализации BlockingQueue являются потокобезопасными.

Он также предоставляет пример производителя - потребителя.

0

Нет, вам не нужно его явно synchronize.

Внутри он использует ReentrantLock для защиты доступа,

    final ReentrantLock lock;
    /** Condition for waiting takes */
    private final Condition notEmpty;
    /** Condition for waiting puts */
    private final Condition notFull;

См. Исходный код Например:

public boolean offer(E e) {
        checkNotNull(e);
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            //
            //
        } finally {
            lock.unlock();
        }
    }
0

Из документации: "Реализации BlockingQueue являются потокобезопасными". http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню