【发布时间】:2016-04-21 13:52:24
【问题描述】:
我遇到了一个奇怪的情况,在静态初始化程序中使用带有 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,
代码立即完成。谁能解释这种行为?这是一个错误还是有意为之?
我使用的是 OpenJDK 版本 1.8.0_66-internal。
【问题讨论】:
-
范围为 (0, 1) 程序正常终止。有 (0, 2) 或更高的挂起。
-
其实是同一个问题/问题,只是API不同而已。
-
您正在尝试在后台线程中使用一个类,但您尚未完成该类的初始化,因此它无法在后台线程中使用。
-
@Solomonoff'sSecret as
i -> i不是方法引用,它是在 Deadlock 类中实现的static method。如果将i -> i替换为Function.identity(),则此代码应该没问题。
标签: java java-8 deadlock java-stream fork-join