Расскажите о различных очередях в Java.

Java
Расскажите о различных очередях в Java.

1 Обзор

Очередь — это действительно очень хорошая структура данных, упорядоченная, регулярная, и ее можно буферизовать, как и упорядоченное общество в сознании людей, поэтому в этом выпуске Serena мы кратко поговорим об этих обычных очередях в Java.



2: Сравнение различных распространенных очередей

2.1: Сравнительная таблица

очередь структура данных граница Функции параллелизма Функции
ArrayBlockingQueue множество Ограниченный (потому что это массив) блокировать простая структура массива
LinkedBlockingQueue связанный список Можно указать размер (по умолчанию MaxInt) блокировать связанный список
ConcurrentLinkedQueue связанный список Неограниченный нет замка без замков, многопользовательский
DelayQueue куча Неограниченный блокировать Реализовать эффект таймлапса

2.2: Ограниченный и неограниченный, параллелизм

  • Суть ограниченного и неограниченного относится к тому, поддерживает ли очередь неограниченное заполнение, что связано со структурой данных.Например, имя с массивом в основном является массивом, и массив должен указывать свой размер, которые все ограничены. Со ссылкой вы можете сразу увидеть, что это связанный список, тогда узел может быть завис на неопределенное время (пока памяти достаточно), но, как и LinkedBlockingQueue, он все равно будет указывать максимальное монтирование, чтобы предотвратить бум памяти! !

  • Эти контейнеры очередей на самом деле поддерживают параллелизм, но это вопрос эффективности.Как следует из названия, при блокировке он блокируется, а очередь с параллельным использованием использует оптимистическую блокировку cas для достижения конкуренции без блокировки.

2.3: Используйте выбор сцены

  • Можно оценить, что очередь ограничена, можно выбрать ArrayBlockingQueue
  • Один производитель, один потребитель с LinkedBlockingqueue
  • Несколько производителей, один потребитель с LinkedBlockingqueue
  • Один производитель, несколько потребителей с ConcurrentLinkedQueue
  • Многопроизводитель, мульти-потребитель с CONCURRENTLINKEDQUEUE
  • Если эффект задержки вы можете выбрать задержкую

3: Яма ConcurrentLinkedQueue

Пожалуйста, не используйте метод размера ConcurrentLinkedQuene! ! ! ! Вместо этого лучше использовать isEmpty, потому что метод размера будет проходить по узлам связанного списка, чтобы определить размер.

Исходный код выглядит следующим образом:

4: кольцевая очередь прерывателя

Очередь Disruptor — это круговая jvm-очередь следующего поколения, очень эффективная и используемая log4j2.Вы можете прочитать мою другую статью по этому вопросу.Очередь разрушителя, и здесь повторяться не будем.

5: Распределенная очередь сообщений

Конечно, многие из наших текущих проектов или приложений широко используют распределенные сервисы, независимо от redis, dubbo, springcloud и так далее. Поэтому многие очереди памяти jvm не могут удовлетворить наши потребности.В настоящее время нам нужно использовать распределенные очереди сообщений.

Здесь я рекомендую использовать три распределенные очереди сообщений

  • redis: Большинство людей думают, что redis — это просто кеш-база данных kv, на самом деле, redis может использовать функцию мониторинга для реализации очень легкой очереди сообщений.

Однако очередь сообщений, реализованная redis, не может быть постоянной, поэтому она будет потеряна в случае сбоя питания, поэтому рекомендуется использовать ее, если вы передаете какие-то незначительные зарытые точки или статистику.

  • RocketMQ: Али создал очень полную очередь сообщений, API также очень удобен, рекомендуется, не забудьте сосредоточиться на потребностях бизнеса, таких как мощность О! !
  • kafka: эпохальная очередь сообщений, ведущая текущую тенденцию очередей сообщений, со сверхвысокой пропускной способностью, она очень подходит для сценариев с высокой пропускной способностью, таких как реклама, потоковая передача, ведение журнала и т. д. Но если это высоконадежный сценарий, такой как финансы, используйте RocketMQ и синхронно обновите диск!

6: Резюме

Очередь - это действительно панацея. Она проста в использовании и имеет множество сценариев использования. Она может быть отложенной, пиковой и асинхронной. Она объединяет многие классические и важные концепции программирования. Это мощный инструмент в процессе разработки! Каждый должен использовать его рационально!