在Java System.nanoTime()
中,单调的implementation on Linux依赖于CLOCK_MONOTONIC
在操作系统上可用的事实。如果不可用,它将回退到gettimeofday
,当使用nanoTime
测量间隔时,它会导致获得负的时间间隔。例如,以下测试可能会失败。
long t1 = System.nanoTime();
long t2 = System.nanoTime();
assert t2 >= t1
在什么情况下,服务器上可能无法使用CLOCK_MONOTONIC
?假设CLOCK_MONOTONIC
时钟在所有现代Linux服务器上都可用,是否合理?
答案 0 :(得分:2)
假设所有现代Linux服务器上都可以使用CLOCK_MONOTONIC时钟是否合理?
我只能对此问题发表评论。是的,您使用的所有生产级系统都将具有Linux知道如何访问的单调时钟是合理的。虚拟服务器和容器服务器也是如此。
良好的工程设计要求您对此进行检查,并在假设被打破的情况下出错,但是我会在设计时依靠这一点。
答案 1 :(得分:2)
是的。假设是合理的。
从gettime手册条目的措辞中,我们可以推断出glibc的真正旧版本不支持CLOCK_MONOTONIC
。 (我仍在试图弄清楚它的年龄……但是可能是在glibc声称符合POSIX 1003.1的时候。)
CLOCK_MONOTONIC
(至少)在IEEE Std 1003.1,2004版中指定,尽管兼容的libc实现仍然有可能不支持CLOCK_MONOTONIC
。
至少从Linux 3.0(2011年)开始,Linux内核源代码就一直支持CLOCK_MONOTONIC
时钟。
从其他来源来看,这还取决于系统的glibc的构建方式。 (当使用“仿真计时器”构建时,不支持CLOCK_MONOTONIC
。)
在某些情况下不支持它:
某些旧的CPU芯片可能有问题;例如https://bugzilla.redhat.com/show_bug.cgi?id=1499480
Cygwin的某些(全部?)版本不支持。
ARM上的某些(全部?)uCLibc版本不支持。
CLOCK_MONOTONIC
也可能受支持,但有问题: