Lambda 并行流 跟 类初始化死锁问题记录
首先看以下代码
public class Oddity { private static int[] o = new SplittableRandom().ints().limit(1000000).parallel().filter(i->(1&i)==1).toArray(); public static void main(String[] args) { System.out.println(o.length); } }
可以猜测下,输出结果
执行这个方法,是不会有结束和输出的,会在类初始化就死锁卡住不动了。
如果你去掉代码中 parallel() ,则这个方法是可以执行完成的。
把属性o 设置为非静态变量,则方法也可执行完成。
原因大概是属性数组o是静态的,再初始化类的时候就会进行静态数据初始化,主线程会等待o初始化完成,但是o使用并行流在其他线程中计算lambda表达式结果,这些线程又会等待主类初始化完成返回结果,至此形成死锁。