栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

流和parallelStream

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

流和parallelStream

An

ArrayList
未同步。没有定义尝试同时向其添加元素。来自
forEach

对于并行流管道,此操作不能保证尊重流的遇到顺序,因为这样做会牺牲并行性的好处。 对于任何给定的元素,可以在库选择的任何时间和线程中执行该操作

在第二个示例中,最终导致多个线程同时调用

add
数组列表,并且
ArrayList
文档显示:

请注意,此实现未同步。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改列表,则必须在外部进行同步。

错误的解决方案

如果你改变了使用的

ArrayList
一个
Vector
,你会得到正确的结果,因为这个列表实现同步。它的Javadoc说:

与新的集合实现不同,它

Vector
是同步的。

但是,请不要使用它!此外,由于显式同步,它最终可能会变慢。

正确的方法

明确地避免这种情况的是,Stream API
使用该方法提供了可变的简化范例

collect
。下列

List<String> values = list.stream().map(i -> "foo").collect(Collectors.toList());

无论是否并行运行,都将始终提供正确的结果。Stream管道在内部处理并发,并确保在并行流的collect操作中使用非并发收集器是安全的。

Collectors.toList()
是一个内置的收集器,它将一个Stream的元素累积到一个列表中。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454658.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号