ConcurrentLinkedQueue
Потокобезопасная очередь без блокировок.
Доступно с: Java 1.5
Синтаксис
public class ConcurrentLinkedQueue<E> implements Queue<E>Примеры
Очередь, которую наполняют несколько потоков:
void main() {
var queue = new ConcurrentLinkedQueue<String>();
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 50; i++) {
int n = i;
executor.submit(() -> queue.offer("event-" + n));
}
}
IO.println(queue.size());
IO.println(queue.contains("event-49"));
}Результат:
50
trueПримечания
poll() на пустой очереди возвращает null, не дожидаясь элементов. Если потребитель должен ждать новых элементов, используйте BlockingQueue (LinkedBlockingQueue, ArrayBlockingQueue) с методами put() и take(). Для списков, которые часто читают и редко меняют, есть CopyOnWriteArrayList.
См. также
- ConcurrentHashMap — Потокобезопасный словарь для одновременной работы из многих потоков.
- Queue — Очередь: элементы добавляются в конец и забираются из начала.
- ArrayDeque — Быстрая двусторонняя очередь на массиве — замена `Stack` и `LinkedList`.
В учебнике
- Потокобезопасные коллекции — Коллекции для многопоточного кода в Java — ConcurrentHashMap и merge, CopyOnWriteArrayList, BlockingQueue и схема производитель — потребитель.