这个答案是在2011年写的,从当时运行的Sun JDK在当时的操作系统上实际做了什么的角度来看。那是很久以前的事了!列文托夫的答案提供了一个更新的观点。
那篇文章是错误的,是安全的。这篇文章上有一条评论,链接到David Holmes的一篇博客文章,David Holmes是Sun的实时和并发人员。它说:nanoTime
System.nanoTime() 是使用 QueryPerformanceCounter/QueryPerformanceFrequency API 实现的 [...]QPC使用的默认机制由硬件抽象层(HAL)[...]此默认值不仅跨硬件更改,而且跨操作系统版本更改。例如,Windows XP Service Pack 2 更改了使用电源管理计时器 (PMTimer) 而不是处理器时间戳计数器 (TSC) 的情况,因为 TSC 在 SMP 系统中的不同处理器上未同步,并且由于它的频率可以根据电源管理设置而变化(因此它与经过时间的关系)。
因此,在Windows上,直到WinXP SP2之前,这都是一个问题,但现在不是了。
我找不到讨论其他平台的第二部分(或更多),但那篇文章确实包括Linux遇到并以相同的方式解决了相同问题的评论,并链接到clock_gettime(CLOCK_REALTIME)的常见问题解答,其中说:
- clock_gettime(CLOCK_REALTIME) 在所有处理器/内核上是否一致?(拱门重要吗?例如ppc,arm,x86,amd64,sparc)。
它应该或它被认为是有缺陷的。
但是,在 x86/x86_64上,可能会看到未同步或可变频率的 TSC 导致时间不一致。2.4 内核真的没有针对此的保护,早期的 2.6 内核在这里的表现也不太好。从 2.6.18 及更高版本开始,检测此情况的逻辑更好,我们通常会回退到安全的时钟源。
ppc始终具有同步的时基,因此这应该不是问题。
因此,如果Holmes的链接可以被理解为暗示调用,那么从x86上的内核2.6.18开始,它就是安全的,并且始终在PowerPC上(因为IBM和摩托罗拉与英特尔不同,实际上知道如何设计微处理器)。nanoTime
clock_gettime(CLOCK_REALTIME)
可悲的是,没有提到SPARC或Solaris。当然,我们不知道IBM JVM是做什么的。但是现代Windows和Linux上的Sun JVM是正确的。
编辑:这个答案是基于它引用的来源。但我仍然担心它实际上可能是完全错误的。一些更新的信息将非常有价值。我刚刚发现了一个关于Linux时钟的四年新文章的链接,这可能是有用的。