从当时的Sun JDK在当时的操作系统上运行的观点来看,该答案写于2011年。那是很久以前的事!列文托夫的答案提供了最新的观点。
该帖子是错误的,并且nanoTime
很安全。Sun的实时与并发专家David Holmes对该博客发表了评论。它说:
使用QueryPerformanceCounter / QueryPerformanceFrequency API实现System.nanoTime()。QPC使用的默认机制由硬件抽象层(HAL)确定。版本。例如,由于TSC无法在SMP系统中的不同处理器上同步的问题,Windows XP Service Pack 2更改了使用电源管理计时器(PMTimer)而不是处理器时间戳计数器(TSC)的功能。可以根据电源管理设置而变化(并因此而变化与经过时间的关系)。
因此,在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的链接可以理解为暗示有nanoTime
调用clock_gettime(CLOCK_REALTIME)
,则从x86内核2.6.18开始,并且始终在PowerPC上,它是安全的(因为IBM和Motorola与Intel不同,实际上知道如何设计微处理器)。
遗憾的是,没有提到SPARC或Solaris。当然,我们不知道IBM JVM的作用。但是现代Windows和Linux上的Sun JVM可以实现这一目标。
编辑:这个答案是基于它引用的来源。但是我仍然担心这实际上可能是完全错误的。一些最新的信息将非常有价值。我刚找到一个有关Linux时钟的四年更新文章的链接。可能会有用。