Связаны ли LinkedBlockingQueue и удаляют методы потокобезопасными?
Я использую LinkedBlockingQueue
между двумя разными потоками. Один поток добавляет данные через add
, а другой поток принимает данные через take
.
Мой вопрос: мне нужно синхронизировать доступ к add
и take
. LinkedBlockingQueue
Вставить и удалить методы потокобезопасными?
Ответы
Ответ 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.