【发布时间】:2016-02-23 11:19:51
【问题描述】:
我有一个方法可以返回从自定义拆分器生成的流;分离器不安全。由于分离器不安全,并且它保持状态,我想防止它并行运行。有没有办法防止返回的流并行运行?
我找不到任何这样做的文档或示例。我确实在BaseStream 类上找到了sequential() 方法,但这似乎并不能阻止用户调用parallel() 来获得并行流。
【问题讨论】:
-
您不需要拆分器来保证线程安全,也可以用于并行使用。流框架将为您管理线程安全。
-
我的想法完全正确。该文档明确指出:尽管在并行算法中具有明显的实用性,但拆分器不应该是线程安全的。
-
@JBNizet 您引用的完整句子是“尽管拆分器在并行算法中具有明显的实用性,但不期望拆分器是线程安全的;相反,使用拆分器的并行算法的实现应确保spliterator 一次只能由一个线程使用。"。我关心的是那句话的后半部分,我找不到任何说明并行流将按顺序访问拆分器的文档。
-
@MikeRylander 该文档适用于编写自己的流(如实用程序)的人;您可以放心地假设流库本身已正确实现。您可以放心地假设 JDK 遵循自己的建议。此外,在 spliterators 中内置的 JDK 都不是线程安全的,如果这会破坏并行流的话,这会破坏并行流的意义。
-
@LouisWasserman,如果拆分过程创建的对等点不改变共享状态,拆分器可能不关心线程安全。这并非总是如此。 Here 在 JDK-9 中的 Spliterator 示例,它维护共享状态(
AtomicBoolean变量)。有时我会编写更复杂的拆分器,它们应该非常关心线程安全。
标签: java java-stream spliterator