Ser*_*rCe 6 java linux time clock gettimeofday
Java在 Linux上System.nanoTime()的单调实现依赖于操作系统上CLOCK_MONOTONIC可用的事实。如果它不可用,它会回退到gettimeofday这可能导致在使用nanoTime. 例如,以下测试可能会失败。
long t1 = System.nanoTime();
long t2 = System.nanoTime();
assert t2 >= t1
Run Code Online (Sandbox Code Playgroud)
在哪些情况下CLOCK_MONOTONIC可能在服务器上不可用?假设CLOCK_MONOTONIC时钟在所有现代 Linux 服务器上都可用是否合理?
假设 CLOCK_MONOTONIC 时钟在所有现代 Linux 服务器上都可用是否合理?
是的。这么假设是合理的。
从 gettime 手册条目的措辞,我们可以推断真正旧版本的 glibc 不支持CLOCK_MONOTONIC. (我仍在试图弄清楚它的年龄......但可能是在 glibc 声称符合 POSIX 1003.1 时。)
CLOCK_MONOTONICIEEE Std 1003.1, 2004 Edition 中(至少)指定了CLOCK_MONOTONIC.
Linux 内核源代码CLOCK_MONOTONIC至少从 Linux 3.0 (2011)开始就支持时钟。
从其他来源来看,它还取决于您系统的 glibc 是如何构建的。(当使用“模拟计时器”构建时,CLOCK_MONOTONIC不支持。)
以下是一些不受支持的情况:
一些旧的 CPU 芯片可能有问题;例如https://bugzilla.redhat.com/show_bug.cgi?id=1499480
某些(所有?)版本的 Cygwin 不支持它。
ARM 上的某些(所有?)版本的 uCLibc 不支持它。
也可以CLOCK_MONOTONIC支持但有问题: