Любая из коллекций или структура данных не является блокирующей в Java

При обработке событий функция помещает значения в коллекцию, а другая удаляет из той же коллекции. Элементы должны быть помещены в коллекцию в том порядке, в котором они были получены из источника (сокеты) и прочитаны таким же образом, иначе результаты изменятся.

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

Например, один поток читает из очереди, а другой записывает в ту же очередь. Либо одна операция выполняется в очереди, пока не снимет блокировку. Есть ли какая-либо структура данных, которая избегает этого.

2 ответа

ConcurrentLinkedQueue является одним из примеров. Пожалуйста, смотрите другие классы от java.util.concurrent,

Есть еще более производительные сторонние библиотеки для конкретных случаев, например, LMAX Disruptor

Фактически, LinkedBlockingQueue является самым простым в использовании во многих случаях из-за его блокирующих методов put и take, которые ожидают, когда есть элемент, чтобы взять, или места для вставки другого элемента в случае, если активирован верхний предел размера, называемый емкость. Установка емкости не является обязательной, и без таковой очередь может расти бесконечно.

ArrayBlockingQueue, с другой стороны, является наиболее эффективным и красивым из них, он внутренне использует кольцевой буфер и поэтому должен иметь фиксированную емкость. Это намного быстрее, чем LinkedBlockingQueue, но далеко от максимальной пропускной способности, которую вы можете достичь с помощью прерывателя:)

В обоих случаях блокировка не является обязательной с обеих сторон. Также поддерживается неблокирующий API для всех параллельных очередей. Блокирующие и неблокирующие API могут быть смешаны.

Во многих случаях очередь не является узким местом, и когда это действительно так, использование прерывателя часто является разумной вещью. Это не очередь, а кольцевой буфер, совместно используемый участвующими потоками с разными ролями, т. Е. Обычно один производитель, n работников и один потребитель. Немного более громоздко настраивать, но на современном оборудовании возможна скорость около 100 миллионов транзакций в секунду, потому что оно не требует дорогих изменчивых переменных, но полагается на более тонкие способы сериализации чтения и записи, которые зависят от машины (вам в основном нужно писать части такого в ассемблере):)

Другие вопросы по тегам