细说哪些使用parallelStream遇到的坑

189 阅读1分钟

【原创】java并行流问题

线程安全问题

这个问题是我以前偶然用并行流操作数据库数据时发现的问题,后面查阅了资料发现使用并行流操作数据时会有线程安全的问题.

使用线程不安全的集合

image.png

image.png

这种错误的方式会导致数据下标越界或者空指针。

线程安全的集合

    public static void testParallelStream() {
        List<Integer> integers = new ArrayList<>();
        for (int i = 0; i < 1000; i++ ) {
            integers.add(i);
        }
​
//        List<String> strings = new ArrayList<>();
//        integers.parallelStream().forEach(i -> strings.add(i.toString()));
//        System.out.println(strings);
​
        System.out.println("换成线程安全的集合");
        List<String> str = Collections.synchronizedList(new ArrayList<>());
        integers.parallelStream().forEach(i -> str.add(i.toString()));
​
        System.out.println(str);
    }

输出结果

image.png

虽然这样解决了并行流线程安全的问题,但是数据的顺序还是乱序的,要想并行流的数据按自己想要的顺序排序,那么根据自己定义的排序规则执行collect方法形成一个新的集合,从而数据有序。