Collectors.joining(“,”)线程安全吗?
java.util.stream.Collectors::joining
实现是否是线程安全的? 我能做点什么吗
public final class SomeClass { private static final Collector jc = Collectors.joining(","); public String someMethod(List someList) { return someList.parallelStream().collect(jc); } }
不用担心遇到并发问题?
您可以将此收集器用作Collectors
类中提供的任何其他收集Collectors
而不必担心遇到并发问题。 除非具有CONCURRENT
特性,否则Collector
无需关心螺纹安全性。 它只需要使其操作不干扰,无状态和关联。 其余的将由Stream管道本身完成。 它将以不需要额外同步的方式使用收集器function。 特别是当调用accumulator
或combiner
函数时,保证当前没有其他线程在相同的累加值上运行。 这在收集器文档中指定:
基于
Collector
实现缩减的库Stream.collect(Collector)
如Stream.collect(Collector)
必须遵循以下约束:<...>
- 对于非并发收集器,从结果提供者,累加器或组合器函数返回的任何结果必须是串行线程限制的。 这使得集合可以并行发生,而
Collector
不需要实现任何其他同步。 减少实现必须管理输入被正确分区,分区是单独处理的,并且只有在累积完成后才进行组合。
请注意,收集器本身是无状态的,也是它提供的function,因此将它放在静态字段中也是安全的。 状态保存在外部蓄能器中,由supplier
返回并传递回accumulator
, combiner
和finisher
。 因此,即使多个流操作重用相同的收集器,它们也不会干扰。