Любая из коллекций или структура данных не является блокирующей в Java
При обработке событий функция помещает значения в коллекцию, а другая удаляет из той же коллекции. Элементы должны быть помещены в коллекцию в том порядке, в котором они были получены из источника (сокеты) и прочитаны таким же образом, иначе результаты изменятся.
Очередь - это набор, рекомендуемый большинством людей, но в то же время блокируется ли очередь при добавлении элемента, и, следовательно, другая функция должна ждать, пока добавление не будет завершено, что делает его неэффективным и задержка в работе увеличивается со временем.
Например, один поток читает из очереди, а другой записывает в ту же очередь. Либо одна операция выполняется в очереди, пока не снимет блокировку. Есть ли какая-либо структура данных, которая избегает этого.
2 ответа
ConcurrentLinkedQueue является одним из примеров. Пожалуйста, смотрите другие классы от java.util.concurrent
,
Есть еще более производительные сторонние библиотеки для конкретных случаев, например, LMAX Disruptor
Фактически, LinkedBlockingQueue является самым простым в использовании во многих случаях из-за его блокирующих методов put и take, которые ожидают, когда есть элемент, чтобы взять, или места для вставки другого элемента в случае, если активирован верхний предел размера, называемый емкость. Установка емкости не является обязательной, и без таковой очередь может расти бесконечно.
ArrayBlockingQueue, с другой стороны, является наиболее эффективным и красивым из них, он внутренне использует кольцевой буфер и поэтому должен иметь фиксированную емкость. Это намного быстрее, чем LinkedBlockingQueue, но далеко от максимальной пропускной способности, которую вы можете достичь с помощью прерывателя:)
В обоих случаях блокировка не является обязательной с обеих сторон. Также поддерживается неблокирующий API для всех параллельных очередей. Блокирующие и неблокирующие API могут быть смешаны.
Во многих случаях очередь не является узким местом, и когда это действительно так, использование прерывателя часто является разумной вещью. Это не очередь, а кольцевой буфер, совместно используемый участвующими потоками с разными ролями, т. Е. Обычно один производитель, n работников и один потребитель. Немного более громоздко настраивать, но на современном оборудовании возможна скорость около 100 миллионов транзакций в секунду, потому что оно не требует дорогих изменчивых переменных, но полагается на более тонкие способы сериализации чтения и записи, которые зависят от машины (вам в основном нужно писать части такого в ассемблере):)