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

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

Ответ 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.