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

Когда следует использовать SynchronousQueue

new SynchronousQueue()
new LinkedBlockingQueue(1)

В чем разница? Когда я должен использовать SynchronousQueue против LinkedBlockingQueue с емкостью 1?

4b9b3361

Ответ 1

SynchronousQueue больше относится к передаче обслуживания, тогда как LinkedBlockingQueue позволяет только один элемент. Разница заключается в том, что вызов put() на SynchronousQueue не будет возвращаться до тех пор, пока не будет вызван соответствующий вызов take(), но с LinkedBlockingQueue размера 1 вызов put() (в пустую очередь) немедленно вернется.

Я не могу сказать, что я когда-либо использовал SynchronousQueue непосредственно, но это стандартный метод BlockingQueue, используемый для методов Executors.newCachedThreadPool(). Это, по сути, реализация BlockingQueue, когда вам действительно не нужна очередь (вы не хотите поддерживать какие-либо ожидающие данные).

Ответ 2

Насколько я понимаю, код выше делает то же самое.

Нет, код не совпадает.

Sync.Q. требует, чтобы официант (ов) предлагал преуспеть. LBQ сохранит этот предмет и предложит его немедленно, даже если нет официанта.

SyncQ полезен для передачи обслуживания задач. Представьте, что у вас есть список ожидающих задач и 3 потока, доступных в очереди, попробуйте offer() с 1/4 списка, если он не принят, поток может запустить задачу самостоятельно. [последний 1/4 должен обрабатываться текущей нитью, если вы задаетесь вопросом, почему 1/4, а не 1/3]

Подумайте о попытке передать задачу работнику, если ни один из них не доступен, у вас есть возможность выполнить задачу самостоятельно (или выбросить исключение). Наоборот, w/LBQ, оставив задачу в очереди, не гарантирует выполнение.

Примечание: случай с потребителями и издателями одинаковый, то есть издатель может блокировать и ждать потребителей, но после возврата offer или poll он обеспечивает обработку элемента task/.

Ответ 3

Одной из причин использования SynchronousQueue является повышение производительности приложений. Если вы должны иметь посредничество между потоками, вам понадобится некоторый объект синхронизации. Если вы можете удовлетворить условия, необходимые для его использования, SynchronousQueue - это самый быстрый объект синхронизации, который я нашел. Другие согласны. Смотрите: Реализация BlockingQueue: каковы различия между SynchronousQueue и LinkedBlockingQueue

Ответ 4

SynchronousQueue работает аналогично следующим основным различиям: 1) Размер SynchronousQueue равен 0 2) метод put() будет только вставлять элемент, если метод take() сможет извлечь этот элемент из очереди в тот же момент, т.е. Элемент не может быть вставлен, если вызов пользователя take() будет занимать некоторое время потребляйте его.

SynchronousQueue - вставлять только тогда, когда кто-то получит его в тот момент.