Java 收集器.连接(“,”)是线程安全的吗?

Java 收集器.连接(“,”)是线程安全的吗?,java,concurrency,java-8,java-stream,Java,Concurrency,Java 8,Java Stream,java.util.stream.Collectors::加入实现是否线程安全?我能做点像这样的事吗 public final class SomeClass { private static final Collector<CharSequence, ?, String> jc = Collectors.joining(","); public String someMethod(List<String> someList) { return s

java.util.stream.Collectors::加入实现是否线程安全?我能做点像这样的事吗

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

  public String someMethod(List<String> someList) {
       return someList.parallelStream().collect(jc);
  }
}
public final类SomeClass{
私有静态最终收集器jc=Collectors.joining(“,”);
公共字符串someMethod(列表someList){
返回someList.parallelStream().collect(jc);
}
}

无需担心会遇到并发问题?

您可以将此收集器与
收集器
类中提供的任何其他收集器一样使用,而无需担心会遇到并发问题。
收集器
不需要关心线程安全,除非它具有
并发
特性。它只需要使其操作无干扰、无状态和关联。其余部分将由流管道本身完成。它将以不需要额外同步的方式使用收集器函数。特别是当调用
累加器
组合器
函数时,可以保证此时没有其他线程在相同的累积值上运行。这在文件中有详细说明:

基于
收集器
实现缩减的库,例如
Stream.collect(收集器)
,必须遵守以下约束:

  • 对于非并发收集器,从结果提供者、累加器或组合器函数返回的任何结果都必须是串行线程限制的。这使得采集可以并行进行,而无需
    采集器
    执行任何额外的同步。缩减实现必须管理输入被正确分区,分区被隔离处理,并且只有在累积完成后才进行合并

请注意,收集器本身以及它提供的函数都是无状态的,因此将其放在静态字段中也是安全的。该状态保存在外部累加器中,该累加器由
供应商返回,并传回
累加器
组合器
修整器
。因此,即使同一个收集器被多个流操作重用,它们也不会相互干扰。

据我所知,处理线程安全性不是收集器的责任。收集器只是提供了一种解释在何处收集的方法,但它是处理何时收集的流(也应该是线程安全的).@Pshemo在本例中,多个流使用同一个共享收集器。@Pshemo在查看实现时,它似乎可以工作-我不知道它是否特定于此收集器,或者它是否是其线程安全性的派生结果。@assylias您是对的。我错误地认为,
jk
Collector
正在为每个连接使用一个
StringJoiner
,因此我认为每个流都应该有自己独立的
收集器。但现在我看到,
collect(jc)
的每次调用最终都会创建
新的StringJoiner
,因此以问题中所示的方式使用它应该是可以的(除非有人在stream完成收集工作之前编辑
someList
,但这是
someList
而不是stream的问题),它是非常通用的