Java 8 拆分器:线程是否安全?
我正在查看拆分器的文档,根据它,拆分器不是线程安全的: 尽管拆分器在并行算法中具有明显的实用性,但它并不具有线程安全性;相反,使用拆分器的并行算法的实现应该确保拆分器一次只能由一个线程使用。这通常很容易通过串行线程限制实现,这通常是通过递归分解工作的典型并行算法的自然结果 但是,在其进一步的文件中,陈述了与上述陈述相矛盾的陈述: 源的结构干扰可通过以下方式进行管理(按期望值递减的近似顺序): 源代码管理并发修改。 例如,java.util.concurrent.ConcurrentHashMap的键集是一个并发源。从源创建的拆分器报告并发的特征Java 8 拆分器:线程是否安全?,java-8,iterator,thread-safety,java-stream,spliterator,Java 8,Iterator,Thread Safety,Java Stream,Spliterator,我正在查看拆分器的文档,根据它,拆分器不是线程安全的: 尽管拆分器在并行算法中具有明显的实用性,但它并不具有线程安全性;相反,使用拆分器的并行算法的实现应该确保拆分器一次只能由一个线程使用。这通常很容易通过串行线程限制实现,这通常是通过递归分解工作的典型并行算法的自然结果 但是,在其进一步的文件中,陈述了与上述陈述相矛盾的陈述: 源的结构干扰可通过以下方式进行管理(按期望值递减的近似顺序): 源代码管理并发修改。 例如,java.util.concurrent.ConcurrentHashMap
那么,这是否意味着从线程安全集合生成的拆分器是线程安全的呢?是否正确?否,报告
并发
特性的拆分器将有一个线程安全的源,这意味着即使在并发修改源时,它也可以安全地对其进行迭代。但是拆分器本身可能仍然具有不能同时操作的状态
请注意,您的引用源于对“如何管理源的结构干扰”的描述,而不是关于拆分器的一般行为
以下网址也提供了这一信息:
特征值,表示可以由多个线程安全地同时修改元素源(允许添加、替换和/或删除),而无需外部同步。如果是这样的话,拆分器应该有一个关于遍历期间修改影响的文档化策略
没有别的了
因此,这些特征的后果是惊人的小。一个拆分器
报告并发
或不可变
将永远不会抛出并发修改异常
,仅此而已。在所有其他方面,流
API不会识别这些特征之间的差异,因为流
API从不执行任何源操作,事实上,它实际上并不知道源(除了通过拆分器
间接知道源之外),因此,它无法执行此类操作,也无法检测是否发生了并发修改。我看不出这两条语句有任何矛盾:Spliterator
不要求是线程安全的,但它可以是线程安全的。如果它是线程安全的,它可能会报告它具有并发
特性。