new SynchronousQueue()
new LinkedBlockingQueue(1)
В чем разница? Когда я должен использовать SynchronousQueue
против LinkedBlockingQueue
с емкостью 1?
new SynchronousQueue()
new LinkedBlockingQueue(1)
В чем разница? Когда я должен использовать SynchronousQueue
против LinkedBlockingQueue
с емкостью 1?
SynchronousQueue больше относится к передаче обслуживания, тогда как LinkedBlockingQueue позволяет только один элемент. Разница заключается в том, что вызов put() на SynchronousQueue не будет возвращаться до тех пор, пока не будет вызван соответствующий вызов take(), но с LinkedBlockingQueue размера 1 вызов put() (в пустую очередь) немедленно вернется.
Я не могу сказать, что я когда-либо использовал SynchronousQueue непосредственно, но это стандартный метод BlockingQueue, используемый для методов Executors.newCachedThreadPool()
. Это, по сути, реализация BlockingQueue, когда вам действительно не нужна очередь (вы не хотите поддерживать какие-либо ожидающие данные).
Насколько я понимаю, код выше делает то же самое.
Нет, код не совпадает.
Sync.Q. требует, чтобы официант (ов) предлагал преуспеть. LBQ сохранит этот предмет и предложит его немедленно, даже если нет официанта.
SyncQ полезен для передачи обслуживания задач. Представьте, что у вас есть список ожидающих задач и 3 потока, доступных в очереди, попробуйте offer()
с 1/4 списка, если он не принят, поток может запустить задачу самостоятельно. [последний 1/4 должен обрабатываться текущей нитью, если вы задаетесь вопросом, почему 1/4, а не 1/3]
Подумайте о попытке передать задачу работнику, если ни один из них не доступен, у вас есть возможность выполнить задачу самостоятельно (или выбросить исключение). Наоборот, w/LBQ, оставив задачу в очереди, не гарантирует выполнение.
Примечание: случай с потребителями и издателями одинаковый, то есть издатель может блокировать и ждать потребителей, но после возврата offer
или poll
он обеспечивает обработку элемента task/.
Одной из причин использования SynchronousQueue является повышение производительности приложений. Если вы должны иметь посредничество между потоками, вам понадобится некоторый объект синхронизации. Если вы можете удовлетворить условия, необходимые для его использования, SynchronousQueue - это самый быстрый объект синхронизации, который я нашел. Другие согласны. Смотрите: Реализация BlockingQueue: каковы различия между SynchronousQueue и LinkedBlockingQueue
SynchronousQueue работает аналогично следующим основным различиям: 1) Размер SynchronousQueue равен 0 2) метод put() будет только вставлять элемент, если метод take() сможет извлечь этот элемент из очереди в тот же момент, т.е. Элемент не может быть вставлен, если вызов пользователя take() будет занимать некоторое время потребляйте его.
SynchronousQueue - вставлять только тогда, когда кто-то получит его в тот момент.