这是原来的代码:
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 使用有什么玄学么?
1
notreami 2017-03-21 21:45:08 +08:00
并行计算,可以理解为多线程便利
|
2
sagaxu 2017-03-21 21:49:51 +08:00 via Android
无序
|
3
qiyuey 2017-03-21 21:50:10 +08:00 1
并行流,需要线程安全
|
5
phx13ye 2017-03-22 02:10:12 +08:00
你这个 set synchronize 一下试试看什么结果
|
6
imcczy OP |
7
Michaelssss 2017-03-22 10:18:27 +08:00
本来 Map.size()这个就不是线程安全的吧。。。我记得是。。
|
9
mononite 2017-03-22 12:40:22 +08:00
collection.parallelStream().collect(Collectors.toSet())
对 parallel stream , Collectors.toSet()先把输入分成多个部分,每部分生成一个 Set ,最后再把多个 Set 合成一个,性能更好还是更坏,取决于你的数据。 |