Depth of Parallel Stream in Java
Depth of Parallel Stream in Java
- by utk
Great — diving into deep-level understanding of Java parallel streams requires looking
at:
Internals:
• Uses work-stealing algorithm: idle threads "steal" tasks from busy ones.
• Operates on the Spliterator (split + iterator) to divide the source.
• Default parallelism: number of available processors
(Runtime.getRuntime().availableProcessors()), unless overridden.
java
CopyEdit
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Spliterator<Integer> spliterator = list.spliterator();
Check with:
java
CopyEdit
Spliterator<T> spliterator = stream.spliterator();
int characteristics = spliterator.characteristics();
java
CopyEdit
List<Integer> list = new ArrayList<>();
IntStream.range(0, 1000).parallel().forEach(list::add); // Unsafe
java
CopyEdit
List<Integer> list = IntStream.range(0, 1000)
.parallel()
.boxed()
.collect(Collectors.toList());
🔹 6. Performance Tips
Tip Explanation
Prefer arrays or ArrayList They split better (random access is fast)
Use IntStream, LongStream, etc. to avoid
Avoid boxing/unboxing
performance hit
Minimize stateful operations Stateless lambdas are much safer
Measure using
For precise benchmarking
System.nanoTime()
Consider a custom To avoid overloading commonPool (used
ForkJoinPool elsewhere)
try {
int sum = pool.submit(() ->
data.parallelStream()
.mapToInt(i -> i)
.sum()
).get();
🔹 Summary Table
Sequential
Aspect Parallel Stream
Stream
Multi-threaded
Threading Single-threaded
(ForkJoinPool)
Order Preserved May not preserve
Performance (small
Faster Slower (due to overhead)
data)
Performance (large
Slower Can be faster
data)
Safety Simpler Must manage shared state