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表达式结果,这些线程又会等待主类初始化完成返回结果,至此形成死锁。

 

posted @ 2021-12-24 15:05  衰草寒烟  阅读(107)  评论(0编辑  收藏  举报