为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Qyouu 2019-11-27 14:22:12
我遇到了一个奇怪的情况,在静态初始化程序中使用带有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版本。
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超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) {}

}


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 763 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信