В чем разница между ArrayBlockingQueue и LinkedBlockingQueue

244
28

    В каких сценариях лучше использовать ArrayBlockingQueue и когда лучше использовать LinkedBlockingQueue?
    Если значение по умолчанию LinkedBlockingQueue равно MAX Integer, полезно ли использовать его как BlockingQueue с мощностью по умолчанию?

спросил(а) 2021-01-19T16:10:10+03:00 2 месяца, 3 недели назад
1
Решение
185

ArrayBlockingQueue поддерживается массивом, размер которого никогда не изменится после создания. Установка емкости Integer.MAX_VALUE создала бы большой массив с большими затратами в космосе.
ArrayBlockingQueue всегда ограничен.

LinkedBlockingQueue динамически создает узлы до достижения capacity. Это по умолчанию Integer.MAX_VALUE. Использование такой большой емкости не требует дополнительных затрат в космосе.
LinkedBlockingQueue необязательно ограничен.

ответил(а) 2021-01-19T16:10:10+03:00 2 месяца, 3 недели назад
154

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

ответил(а) 2021-01-19T16:10:10+03:00 2 месяца, 3 недели назад
107

Добавление элемента в ArrayBlockingQueue должно быть более быстрым, поскольку оно означает только установку ссылки на элемент массива объектов Backing, в то время как добавление элемента в LinkedBlockingQueue означает создание Node и установка его элемента, предыдущего и следующих полей, Кроме того, когда мы удаляем элемент из LinkedBlockingQueue, удаленный Node становится мусором, который может повлиять на производительность приложения.


Как и для потребления памяти ArrayBlockingQueue всегда содержит массив Object с полной пропускной способностью, даже если он пуст. С другой стороны, один элемент в LinkedBlockingQueue представляет собой Node с объектом с тремя полями Object.

ответил(а) 2021-01-19T16:10:10+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема