Collectors.joining(",")是线程安全的吗?

时间:2015-06-25 13:31:57

标签: java concurrency java-8 java-stream

java.util.stream.Collectors::joining实现是否是线程安全的?我可以做点什么吗

public final class SomeClass {
  private static final Collector<CharSequence, ?, String> jc = Collectors.joining(",");

  public String someMethod(List<String> someList) {
       return someList.parallelStream().collect(jc);
  }
}

不用担心遇到并发问题?

1 个答案:

答案 0 :(得分:13)

您可以将此收集器用作Collectors类中提供的任何其他收集器,而不必担心会遇到并发问题。 Collector除非具有CONCURRENT特征,否则无需关心线程安全性。它只需要使其操作不干扰,无状态和关联。其余的将由Stream管道本身完成。它将以不需要额外同步的方式使用收集器功能。特别是当调用accumulatorcombiner函数时,它保证当前没有其他线程在相同的累积值上运行。这在Collector文档中指定:

  

基于Collector实施缩减的库(例如Stream.collect(Collector))必须遵守以下约束:

     

&LT; ...&GT;

     
      
  • 对于非并发收集器,从结果提供者,累加器或组合器函数返回的任何结果必须是串行线程限制的。这使得集合可以并行发生,而Collector不需要实现任何其他同步。减少实现必须管理输入被正确分区,分区是单独处理的,并且仅在累积完成后才进行组合。
  •   

请注意,收集器本身是无状态的,也是它提供的功能,因此将它放在静态字段中也是安全的。状态保留在外部累加器中,由supplier返回并传递回accumulatorcombinerfinisher。因此,即使同一个收集器被多个流操作重用,它们也不会干扰。