V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imcczy
V2EX  ›  Java

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

  •  
  •   imcczy · 2017-03-21 21:20:36 +08:00 · 6686 次点击
    这是一个创建于 2831 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是原来的代码:

    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 使用有什么玄学么?

    9 条回复    2017-03-22 12:40:22 +08:00
    notreami
        1
    notreami  
       2017-03-21 21:45:08 +08:00
    并行计算,可以理解为多线程便利
    sagaxu
        2
    sagaxu  
       2017-03-21 21:49:51 +08:00 via Android
    无序
    qiyuey
        3
    qiyuey  
       2017-03-21 21:50:10 +08:00   ❤️ 1
    并行流,需要线程安全
    imcczy
        4
    imcczy  
    OP
       2017-03-21 21:52:02 +08:00
    @qiyuey #2 确实,没考虑到,我再试试
    phx13ye
        5
    phx13ye  
       2017-03-22 02:10:12 +08:00
    你这个 set synchronize 一下试试看什么结果
    imcczy
        6
    imcczy  
    OP
       2017-03-22 09:32:24 +08:00
    @qiyuey #3
    @phx13ye #5 原本是想多线程添加数据,少点处理时间,加上 synchronized 后又只能一个一个添加了,处理时间跟单线程是一样的,摊手
    Michaelssss
        7
    Michaelssss  
       2017-03-22 10:18:27 +08:00
    本来 Map.size()这个就不是线程安全的吧。。。我记得是。。
    phx13ye
        8
    phx13ye  
       2017-03-22 11:52:13 +08:00 via iPhone
    @imcczy 我觉得是因为 hashset 线程不安全导致有重复元素添加进去了
    mononite
        9
    mononite  
       2017-03-22 12:40:22 +08:00
    collection.parallelStream().collect(Collectors.toSet())
    对 parallel stream , Collectors.toSet()先把输入分成多个部分,每部分生成一个 Set ,最后再把多个 Set 合成一个,性能更好还是更坏,取决于你的数据。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2123 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:55 · PVG 08:55 · LAX 16:55 · JFK 19:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.