我遇到了一个奇怪的情况,使用静态初始化程序中带有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) {}
}
这似乎是该行为的最小复现测试用例。如果我:
- 将块放入主方法中而不是静态初始化程序中
- 删除并行化,或者
- 删除lambda表达式
代码将立即完成。有人能解释这种行为吗? 这是一个错误还是有意为之?
我正在使用OpenJDK版本1.8.0_66-internal。
i -> i
不是一个方法引用,而是实现在Deadlock类中的一个静态方法。如果将i -> i
替换为Function.identity()
,那么这段代码就应该可以正常工作了。 - Peter Lawrey