- В каких сценариях лучше использовать ArrayBlockingQueue и когда лучше использовать LinkedBlockingQueue?
- Если значение по умолчанию LinkedBlockingQueue равно MAX Integer, полезно ли использовать его как BlockingQueue с мощностью по умолчанию?
В чем разница между ArrayBlockingQueue и LinkedBlockingQueue
Ответ 1
ArrayBlockingQueue
поддерживается массивом, размер которого никогда не изменится после создания. Установка емкости Integer.MAX_VALUE
создала бы большой массив с большими затратами в космосе.
ArrayBlockingQueue
всегда ограничен.
LinkedBlockingQueue
динамически создает узлы до достижения capacity
. Это по умолчанию Integer.MAX_VALUE
. Использование такой большой емкости не требует дополнительных затрат в космосе.
LinkedBlockingQueue
необязательно ограничен.
Ответ 2
ArrayBlockingQueue<E>
и LinkedBlockingQueue<E>
являются общими реализации интерфейса BlockingQueue<E>
.
ArrayBlockingQueue
поддерживается array
и Queue
налагает порядок как FIFO
. Глава очереди - самый старый элемент с точки зрения времени, а хвост очереди - самый молодой элемент. ArrayBlockingQueue
также является ограниченным фиксированным размером буфера, с другой стороны LinkedBlockingQueue
- это необязательно ограниченная очередь, построенная поверх связанных узлов.
Необязательный аргумент конструктора, связанный с пропускной способностью, служит для предотвращения чрезмерного расширения очереди, потому что если емкость не определена, то она равна Integer.MAX_VALUE
.
Подробнее здесь.
Бенчмарк: http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html
Ответ 3
Добавление элемента в ArrayBlockingQueue должно быть более быстрым, поскольку оно означает только установку ссылки на элемент массива объектов Backing, в то время как добавление элемента в LinkedBlockingQueue означает создание Node и установка его элемента, предыдущего и следующих полей, Кроме того, когда мы удаляем элемент из LinkedBlockingQueue, удаленный Node становится мусором, который может повлиять на производительность приложения.
Как и для потребления памяти ArrayBlockingQueue всегда содержит массив Object с полной пропускной способностью, даже если он пуст. С другой стороны, один элемент в LinkedBlockingQueue представляет собой Node с объектом с тремя полями Object.