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