当 System.nanoTime() 两次调用返回相同值时应该如何处理?

3

这个问题并不是针对System.nanoTime()的攻击。我意识到这是一个相当棘手的方法,难以正确使用。

有哪些方法可以处理System.nanoTime()在调用之间返回相同的值?例如:多个线程调用System.nanoTime()并获得相同的值。

我惊讶地发现,在Windows上运行测试时,我经常看到这种情况发生在我的代码库中。我们使用nanoTime来排序跨多个线程到达的事件。也许这只是一个Windows问题,Linux的单调时钟更精细。

参考资料:


@ElliottFrisch - "...我们使用nanoTime对跨多个线程到达的事件进行排序..." 希望看到您如何使用UUID实现此操作。 - Dawood ibn Kareem
3
为什么不使用原子计数器来对线程进行排序呢? - Claudio Corsi
你的问题是什么?你是在寻找一个替代nanoTime的方法吗?还是想让nanoTime为你工作?看起来你对世界的模型(即一次tick只发生一件事)可能与nanoTime不符。实际上,如果你有多个线程,你不能(没有同步的情况下)为这些事件产生严格的时间顺序。 - Rob
“tick” 的时间长度是多少?我使用的是 Windows 上的 Intel i8。每个操作系统/硬件都有相关文档吗? - kevinarpe
@ClaudioCorsi:这是一个有趣的想法。 - kevinarpe
@kevinarpe - Claudio的想法是正确的解决方案。 - Dawood ibn Kareem
1个回答

4
为了解释为什么您会得到相同的值,请仔细阅读文档:
此方法提供纳秒精度,但不一定提供纳秒分辨率(即值更改的频率) - 除了分辨率至少与currentTimeMillis()一样好之外,不提供任何保证。
您的计算机可能没有足够的时钟分辨率,因此在一段时间内nanoTime将返回相同的数字。
至于您的问题
有哪些处理System.nanoTime()在调用之间返回相同值的方法?
我建议使用某种原子计数器,如Claudio Corsi所建议的那样。

一台新电脑可能不会有所帮助。是否有任何操作系统实际上提供纳秒精度的 nanoTime() - Dawood ibn Kareem
换一台新电脑—太好了。我有一颗8核英特尔CPU,我怀疑我不需要一台新电脑。我猜这是Windows的限制。实际上,我并不需要纳秒级的分辨率,但是我很惊讶数值是多么频繁地相同(每天几次)。 - kevinarpe
1
你换新的之后,我能要你旧的吗? - Dawood ibn Kareem
@DavidWallace 大多数标准操作系统可能不会提供纳秒级分辨率,但可能有一些定制的操作系统会提供。这只是有点玩笑而已。我错过了原始问题中他陈述需求的部分,所以我将那个建议删除了。 - Jeffrey
@kevinarpe 你电脑的核心数量与时钟分辨率关系不大。这要么是硬件限制,要么是操作系统限制。 - Jeffrey
1
@kevinarpe 如果你愿意使用JNI,你可以调用Windows上更高精度计时器的API。http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408%28v=vs.85%29.aspx - Michael Petch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接