如何解决Guava的toImmutableSet和toImmutableList收集器是否是线程安全的?
番石榴有ImmutableSet.toImmutableSet()
和ImmutableList.toImmutableList()
之类的收藏家。他们是线程安全的吗?将它们与并行流一起使用是否安全?
据我所见,使用不是线程安全的常规构建器:
private static final Collector<Object,?,ImmutableSet<Object>> TO_IMMUTABLE_SET =
Collector.of(
ImmutableSet::<Object>builder,ImmutableSet.Builder::add,ImmutableSet.Builder::combine,ImmutableSet.Builder::build);
另一方面,Collector.of()
的第一个和第三个参数使人怀疑JDK可以为每个并行线程创建一个单独的构建器,并将它们的结果组合起来使其成为线程安全的。
解决方法
我相信您应该提出的问题的答案与您实际提出的问题不同。
否,收集器本身不是线程安全的(例如,ImmutableList构建器在Object[]
上执行非同步操作),但更重要的是,收集器不必具有线程安全性即可用于并行流操作。为此,请参见answer from Stuart Marks to question "Parallel streams,collectors and thread safety":
非并行收集器可以安全地与并行流一起使用吗?或者我应该仅在从并行流进行收集时使用并发版本吗?
在并行流的收集操作中使用非并行收集器是安全的。
有关更多详细信息,请阅读答案和指向各个java.util.stream
类的文档/合同的链接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。