Java Object.wait(long, long) 实现与文档不同

Java Object.wait(long, long) Implementation different from Documentation

java.lang.Object 中的方法 Object#wait(long, long) 在其文档中声明

This method is similar to the wait method of one argument, but it allows finer control over the amount of time to wait for a notification before giving up. The amount of real time, measured in nanoseconds, is given by: 1000000*timeout+nanos

这本身是有道理的,但实现并没有反映文档:

public final void wait(long timeout, int nanos) throws InterruptedException
{
    // ... Some range checks

    if (nanos >= 500000 || (nanos != 0 && timeout == 0))
    {
        timeout++;
    }

    wait(timeout);
}

如您所见,它并没有实际使用 nanos 参数,而是简单地将其四舍五入到毫秒并将其添加到 timeout 参数中,然后使用该参数调用不太精确的 wait(long)方法。


为什么 wait(long, long) 的实现与其文档如此不同?是不是JVM特意处理的内在方法?

据我所知,即使 Windows 中的高精度计时器也能为您提供精确到毫秒 (MSDN page) 的分辨率。由于 Java 内部必须使用一些计时器实现来处理等待操作,我想这是限制因素。

这可能只是默认实现,JVM 在通过其 JIT 编译器生成优化代码时以特定于平台的方式将其内化。

类似的事情发生在 - 例如 - Math.{min,max,abs} 方法中,它们在 java 中实现,但被编译器优化的汇编所取代。

如@Nitram 所述,windows 仅在 windows 下提供 millisecond OS-level thread scheduling/waiting. And even measuring (not even waiting) at nanosecond precision is fairly problematic。 IE。更好的实现不能是默认实现,因为它们仅在某些平台上可用。