提示四十八:谨慎使用Stream并行。
- Java8 Stream中可以通过parallel方法非常简单的来实现并行化,但是编写正确的并发程序还是很困难,需要我们仔细考虑。
- 源来自 Stream.iterate 方法,或者使用中间操作 limit 方法,并行化管道不太可能提高其性能。
- 如果想要在
Stream
上通过并行提高性能,最好是通过ArrayList
、HashMap
、HashSet
、ConcurrentHashMap
、等,他们的特点是可以精确而廉价地分割成任意大小的子范围。 - Stream pipeline的终止操作本质上也影响了并发执行的效率。在终止操作有大量依赖顺序的操作时,并行效率就会大受影响。并行较好的终止操作有reduce、min、max、count、sum、anyMatch、allMatch和noneMatch。
- 并行Stream不仅可能降低性能,包括活性失败,还可以导致结果出错,以及难以预计的行为。
- 在适当的情况下,给Stream pipeline添加parallel调用,确实可以在多处理器核的情况下实现近乎线性的倍增。
实际在我们项目中stream的并行用得很少,感觉这样使用并行确实更简单了,但是背后的逻辑却不简单,想要正确使用好parallel,还需要考虑steam里面元素的状态和行为,所以需要认真思考,并做好充分的测试。