Roy*_*ark 12 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);
}
}
Run Code Online (Sandbox Code Playgroud)
不用担心遇到并发问题?
Tag*_*eev 13
您可以将此收集器用作Collectors类中提供的任何其他收集器,而不必担心遇到并发问题.在Collector不用关心线程安全的,除非它有CONCURRENT特点.它只需要使其操作不干扰,无状态和关联.其余的将由Stream管道本身完成.它将以不需要额外同步的方式使用收集器功能.特别是当调用accumulator或combiner调用函数时,保证当前没有其他线程在相同的累积值上运行.这在收集器文档中指定:
基于
Collector诸如此类实现减少的库Stream.collect(Collector)必须遵守以下约束:<...>
- 对于非并发收集器,从结果提供者,累加器或组合器函数返回的任何结果必须是串行线程限制的.这使得集合可以并行发生,而无需
Collector实现任何其他同步.减少实现必须管理输入被正确分区,分区是单独处理的,并且只有在累积完成后才进行组合.
请注意,收集器本身是无状态的,也是它提供的功能,因此将它放在静态字段中也是安全的.状态保存在由返回外部累加器supplier和传回accumulator,combiner和finisher.因此,即使多个流操作重用相同的收集器,它们也不会干扰.
| 归档时间: |
|
| 查看次数: |
1049 次 |
| 最近记录: |