这是原来的代码:
HashSet<ModuleEntry> result = HashSetFactory.make(); for (Iterator<? etends 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 ![]() 并行流,需要线程安全 |
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 合成一个,性能更好还是更坏,取决于你的数据。 |