Подтвердить что ты не робот

Связаны ли LinkedBlockingQueue и удаляют методы потокобезопасными?

Я использую LinkedBlockingQueue между двумя разными потоками. Один поток добавляет данные через add, а другой поток принимает данные через take.

Мой вопрос: мне нужно синхронизировать доступ к add и take. LinkedBlockingQueue Вставить и удалить методы потокобезопасными?

4b9b3361

Ответ 1

Да. Из документы:

"Блокирование реализации Queue потокобезопасный. Все методы очередей достигают своих эффектов, используя атомы внутренние замки или другие формы concurrency. Однако основная масса Коллекционные операции addAll, containsAll, убрать all и removeAll не обязательно выполняются если не указано иное в реализации. Так что, это возможно, например, для addAll (c) сбой (сброс исключения) после добавив только некоторые из элементов в с."

Ответ 2

Да, BlockingQueue методы add() и take() являются потокобезопасными , но с разницей.

add () и take() метод использует 2 разных объекта ReentrantLock.

add() использует

private final ReentrantLock putLock = new ReentrantLock();

take() использует

private final ReentrantLock takeLock = new ReentrantLock();

Следовательно, синхронизируется одновременный доступ к методу add(). Точно так же одновременный доступ к методу take() равен synchronized.

Но одновременный доступ к методу add() и take() не является synchronized, поскольку они используют 2 разных объекта блокировки (за исключением того, что условие окончания очереди равно/пусто).

Ответ 3

Просто Да, он определенно потокобезопасен, иначе он не был бы квалифицирован как кандидат на хранение элемента для ThreadPoolExecutor.

Просто добавьте и извлеките элемент, не беспокоясь о concurrency для BlockingQueue.