java基础-parallelStream

parallelStream

这里不探讨parallelStream实现原理,只说明一下该注意的地方。jdk9不出意外7月份就要发布了,如果你还是在用jdk6的巨婴你该考虑换份工作了!

parallelStream体验过的同学应该都知道,一个单词形容就是speed!但是酸爽的同时也埋着很多坑。下面上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* Created by yuhang on 2017/6/29.
*/
public class Stream {
@Test
public void test() {
ArrayList<Integer> list = IntStream.range(0, 10000).boxed().collect(Collectors.toCollection
(ArrayList::new));
Vector<Integer> vector = new Vector<>();
ArrayList<Integer> list2 = new ArrayList<>();
list.parallelStream().forEach(vector::add);
// list.parallelStream().forEachOrdered(list2::add);
list.parallelStream().forEach(list2::add);
System.out.println(vector.size());
System.out.println(list2.size());
}
}

上面的代码先跑一遍~如果你没抛异常请你再运行几遍,直到出现java.lang.ArrayIndexOutOfBoundsException的异常,如果你没抛异常说明你运气足够好,但是输出的结果vector.size()和list2.size()应该不一样的。我们来分析一下为什么会出现异常:parallelStream底层借助了jdk7就发布的ForkJoin来多线程处理,所以当我们使用了线程不安全的ArrayList当然会在size++或者取值的时候抛出异常。但是奇怪的是为什么我把上面代码的注释去掉就不会抛异常了呢?因为parallelStream有记忆功能?有时间研究下源码~

在从stream和parallelStream方法中进行选择时,我们可以考虑以下几个问题:

  1. 是否需要并行?
  2. 任务之间是否是独立的?是否会引起任何竞态条件?
  3. 结果是否取决于任务的调用顺序?
坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章