Из документации в ссылке, которую вы предоставили
Для большинства источников данных предотвращение помех означает, что источник данных вообще не изменяется во время выполнения потокового конвейера.Заметным исключением из этого являются потоки, источники которых являются параллельными коллекциями, которые специально предназначены для обработки одновременных изменений.Источниками одновременного потока являются источники, Spliterator которых сообщает характеристику CONCURRENT
Из документации SplitIterator (его характеристика CONCURRENT)
static final int CONCURRENT
Характеристиказначение, означающее, что источник элемента может быть безопасно одновременно изменен (допускается добавление, замена и / или удаление) несколькими потоками без внешней синхронизации.Если это так, ожидается, что Spliterator будет иметь документированную политику, касающуюся воздействия изменений во время обхода.
Это реализация из метода потока интерфейса Collection (который не переопределяется в ConcurrentLinkedQueue)
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
Так что, пока ConcurrentLinkedQueue использует CONCURRENT SplitIterator (что он и делает), я предполагаю, что вы можете безопасно выполнять итерацию вашего ConcurrentLinkedQueue с помощью stream ().