java – stream和parallelStream
我有一个像这样的测试代码:
List<Integer> list = new ArrayList<>(1000000); for(int i=0;i<1000000;i++){ list.add(i); } List<String> values = new ArrayList<>(1000000); list.stream().forEach( i->values.add(new Date().toString()) ); System.out.println(values.size()); 运行这个,我得到了一个正确的输出:1000000. 但是,如果我将stream()更改为parallelStream(),如下所示: list.parallelStream().forEach( i->values.add(new Date().toString()) ); 我有一个随机输出,例如:920821. 怎么了? 解决方法ArrayList 未同步.未定义尝试同时向其添加元素.从
forEach 开始:
在第二个示例中,您最终会同时在阵列列表上调用add多个线程,并且ArrayList文档说:
错误的解决方案 如果将ArrayList的使用更改为
但是,do not use it!此外,由于显式同步,它可能最终会变慢. 正确的方法 显然是为了避免Stream API使用 List<String> values = list.stream().map(i -> "foo").collect(Collectors.toList()); 无论是否并行运行,都将始终提供正确的结果. Stream管道在内部处理并发和guarantees that it is safe to use a non-concurrent collector in a collect operation of a parallel stream. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |