为什么java/lang/System中的nullPrintStream()函数将currentTimeMillis()与零进行比较?

Jiv*_*ngs 10 java jvm java-api

当装载系统类,该<clinit>方法实例化in,out以及err PrintStream变量null使用nullPrintStream()方法:

private static PrintStream nullPrintStream() throws NullPointerException {
    if (currentTimeMillis() > 0) {
        return null;
    }
    throw new NullPointerException();
}
Run Code Online (Sandbox Code Playgroud)

我明白为什么会这样,以及为什么变量在加载过程中无法实例化,但我感到困惑的是该方法的内容.

为什么比较currentTimeMillis()0?在什么情况下,这种比较会回归false

Ste*_*eod 6

nullPrintStream()方法的Javadoc给出了一个线索:

但是,不允许编译器内联访问它们,因为它们稍后被initializeSystemClass()设置为更合理的值.

我想这是一个编码黑客,以防止编译器内联一个简单的"返回null"实现.

currentTimeMillis()永远不会小于0.但编译器不够聪明,不知道这一点,因此保留条件语句.

  • `以防止编译器内联简单的"返回null"实现.为什么要阻止它?如果有任何意义,那对我来说是一种理智的检查. (2认同)
  • 更多代码潜水表明,本机方法稍后将字段值设置为更合理的非空值.但编译器不知道本机代码会干扰java.lang.System的字段.这是hacky,凌乱,可能是一个遗物. (2认同)