Java 8 为什么 parallelStream()每次运行的结果都不一样,,

2017-03-21 21:20:36 +08:00
 imcczy

这是原来的代码:

HashSet<ModuleEntry> result = HashSetFactory.make();
for (Iterator<? extends ModuleEntry> it = M.getEntries(); it.hasNext();) {
    		ModuleEntry entry = (ModuleEntry) it.next();
    		if (entry instanceof DexModuleEntry) {    		
    			result.add(entry);
    		} 
    	}

我试着用了 Java8 的流 API :

Collection<ModuleEntry> collection = M.getEntrysCollection();
collection.parallelStream().forEach(moduleEntry -> result.add(moduleEntry));

然后每次运行, result 的大小都是不一样的,醉了,,

去掉 parallelStream ,结果又是对的

collection.forEach(moduleEntry -> result.add(moduleEntry));

这个 parallelStream 使用有什么玄学么?

6524 次点击
所在节点    Java
9 条回复
notreami
2017-03-21 21:45:08 +08:00
并行计算,可以理解为多线程便利
sagaxu
2017-03-21 21:49:51 +08:00
无序
qiyuey
2017-03-21 21:50:10 +08:00
并行流,需要线程安全
imcczy
2017-03-21 21:52:02 +08:00
@qiyuey #2 确实,没考虑到,我再试试
phx13ye
2017-03-22 02:10:12 +08:00
你这个 set synchronize 一下试试看什么结果
imcczy
2017-03-22 09:32:24 +08:00
@qiyuey #3
@phx13ye #5 原本是想多线程添加数据,少点处理时间,加上 synchronized 后又只能一个一个添加了,处理时间跟单线程是一样的,摊手
Michaelssss
2017-03-22 10:18:27 +08:00
本来 Map.size()这个就不是线程安全的吧。。。我记得是。。
phx13ye
2017-03-22 11:52:13 +08:00
@imcczy 我觉得是因为 hashset 线程不安全导致有重复元素添加进去了
mononite
2017-03-22 12:40:22 +08:00
collection.parallelStream().collect(Collectors.toSet())
对 parallel stream , Collectors.toSet()先把输入分成多个部分,每部分生成一个 Set ,最后再把多个 Set 合成一个,性能更好还是更坏,取决于你的数据。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/349257

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX