如果没有你的要求,Java 8 Stream可以并行吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

正如我所看到的,使用Java 8时,显然的代码Stream是“对象”流还是原始流(即IntStream朋友),只需使用:

someStreamableResource.stream().whatever()

但是,也有不少“流式资源” .parallelStream()

读取javadoc时不清楚的是,.stream()流是否始终是顺序的,以及.parallelStream()流是否总是平行的。

然后就是Spliterator,尤其是它的.characteristics()其中之一就是它可以是CONCURRENT,甚至是它IMMUTABLE

我的直觉是,事实上,无论是否Stream可以,默认情况下是平行的,还是平行的,都是以其基础为指导Spliterator

我在正确的轨道上吗?我已经阅读并再次阅读了javadoc,并且仍然无法对这个问题提出明确的答案。

提问于
用户回答回答于

首先,通过规范的镜头。流是并行还是顺序是流状态的一部分。流创建方法应该指定它们是创建顺序流还是并行流(并且大多数在JDK中),但是它们不需要这么说。如果您的流源不说,请不要假设。如果有人向你传递流,不要假设。

并行流可以自行决定回退到顺序(因为顺序执行并行执行,只是可能不完美)。相反的是不正确的。

现在,通过实施的镜头。在Collections和其他JDK类的流创建方法中,我们坚持“创建顺序流,除非用户明确要求并行性”。(然而,其他图书馆有不同的选择,如果他们彬彬有礼,他们会指定他们的行为。)

流平行性和Spliterator之间的关系只能朝一个方向发展。Spliterator可以拒绝分裂 - 有效地拒绝任何并行性 - 但它不能要求客户分割它。所以一个不合作的Spliterator可能会破坏并行性,但不能确定它。

用户回答回答于

API没有太多对此事说:

流是通过顺序或并行执行的初始选择创建的。(例如,Collection.stream()创建一个顺序流,而Collection.parallelStream()创建一个并行流。)

关于一些中间操作可能不是线程安全的推理,您可能需要阅读软件包摘要。软件包摘要讨论了中间操作,有状态与无状态,以及如何Stream在某种程度上正确使用a 。

行为参数对流操作的副作用通常是不鼓励的,因为它们通常会导致无意中违反无状态要求以及其他线程安全危害。

行为参数是无状态中间操作的参数。

API不能做出任何假设

API可以做出任何想要的假设。API的使用者有责任满足这些假设。但是,假设可能会限制可用性。该StreamAPI 鼓励无状态的中间动作,是不是线程安全的创建。由于它不鼓励被禁止,所以大多数Streams将是“默认”的顺序。

扫码关注云+社区