Вопрос проверяет понимание проблем производительности и потокобезопасности при использовании parallelStream в Java.
ParallelStream в Java использует общий пул потоков ForkJoinPool, который по умолчанию имеет размер, равный количеству ядер процессора минус один. При одновременном запуске множества параллельных стримов все они конкурируют за одни и те же потоки, что может привести к блокировкам и снижению производительности.
List<Integer> numbers = IntStream.range(0, 1000).boxed().collect(Collectors.toList());
// Проблема: несколько parallelStream используют общий пул
numbers.parallelStream().forEach(n -> {
// Долгая операция
try { Thread.sleep(100); } catch (InterruptedException e) {}
});
numbers.parallelStream().forEach(n -> {
// Другая долгая операция
try { Thread.sleep(100); } catch (InterruptedException e) {}
});
// Оба стрима конкурируют за потоки, что замедляет выполнениеИспользуйте parallelStream только для больших наборов данных (обычно более 10 000 элементов) и когда операции не зависят от общего состояния. Для изоляции можно создать собственный ForkJoinPool, но это требует осторожности.
Вывод: ParallelStream эффективен для CPU-интенсивных задач с большими данными, но при массовом использовании без контроля может ухудшить производительность из-за конкуренции за потоки.