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。更好的实现不能是默认实现,因为它们仅在某些平台上可用。
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。更好的实现不能是默认实现,因为它们仅在某些平台上可用。