【原创】java并行流问题
线程安全问题
这个问题是我以前偶然用并行流操作数据库数据时发现的问题,后面查阅了资料发现使用并行流操作数据时会有线程安全的问题.
使用线程不安全的集合
这种错误的方式会导致数据下标越界或者空指针。
线程安全的集合
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);
}
输出结果
虽然这样解决了并行流线程安全的问题,但是数据的顺序还是乱序的,要想并行流的数据按自己想要的顺序排序,那么根据自己定义的排序规则执行collect方法形成一个新的集合,从而数据有序。