为什么在静态初始化程序中使用lambda进行并行流会导致死锁?

我遇到了一个奇怪的情况,在静态初始化程序中使用带有lambda的并行流似乎永远没有CPU使用率。这是代码:


class Deadlock {

    static {

        IntStream.range(0, 10000).parallel().map(i -> i).count();

        System.out.println("done");

    }

    public static void main(final String[] args) {}

}

这似乎是此行为的最小再现测试用例。如果我:


将块放入main方法而不是静态初始化器中,

删除并行化,或

删除lambda,

代码立即完成。谁能解释这种行为?它是错误还是故意的?


我正在使用1.8.0_66-内部的OpenJDK版本。


Qyouu
浏览 764回答 3
3回答

手掌心

对于那些想知道其他线程在哪里引用Deadlock该类本身的人来说,Java lambda的行为就像您这样写:public class Deadlock {    public static int lambda1(int i) {        return i;    }    static {        IntStream.range(0, 10000).parallel().map(new IntUnaryOperator() {            @Override            public int applyAsInt(int operand) {                return lambda1(operand);            }        }).count();        System.out.println("done");    }    public static void main(final String[] args) {}}对于常规的匿名类,没有死锁:public class Deadlock {    static {        IntStream.range(0, 10000).parallel().map(new IntUnaryOperator() {            @Override            public int applyAsInt(int operand) {                return operand;            }        }).count();        System.out.println("done");    }    public static void main(final String[] args) {}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java