Java 如何处理System.nanoTime()在调用之间返回相同值的情况?

Java 如何处理System.nanoTime()在调用之间返回相同值的情况?,java,nanotime,Java,Nanotime,此问题不是针对System.nanoTime()的攻击。我意识到这是一个非常棘手的正确使用方法 有哪些方法可以处理调用之间返回相同值的System.nanoTime()?示例:多个线程调用System.nanoTime()并获得相同的值 在Windows上运行测试时,我在代码库中经常看到这种情况,对此我感到惊讶。我们使用nanoTime对跨多个线程到达的事件进行排序。也许这只是Windows的问题,而Linux的单调时钟更细粒度 参考资料: 要解释为什么会得到相同的值,请仔细阅读文档: 该

此问题不是针对
System.nanoTime()
的攻击。我意识到这是一个非常棘手的正确使用方法

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

在Windows上运行测试时,我在代码库中经常看到这种情况,对此我感到惊讶。我们使用
nanoTime
对跨多个线程到达的事件进行排序。也许这只是Windows的问题,而Linux的单调时钟更细粒度

参考资料:


要解释为什么会得到相同的值,请仔细阅读文档:

该方法提供纳秒精度,但不一定 纳秒分辨率(即值变化的频率)-否 作出保证,但决议至少与 currentTimeMillis()的值

您的计算机可能没有足够的时钟分辨率,因此可能有一段时间
nanoTime
会返回相同的数字

至于你的问题

有哪些方法可以处理System.nanoTime()返回相同的值 通话间隔的价值


正如Claudio Corsi所建议的那样,我建议使用某种类型的an。

@ElliottFrisch-“…我们使用纳米时间对跨多个线程到达的事件进行排序…”希望看到您使用UUID进行排序。为什么不使用原子计数器对线程进行排序呢?问题到底是什么?你在寻找纳米时代的替代品吗?还是一种让纳米时间为你服务的方法?也许你的世界模型(在一个滴答声中只有一件事发生)不适合纳米时代。实际上,如果你有多个线程,你就不能(没有同步)为这些事件生成一个严格的时间顺序?我是Windows上的英特尔i8。每个操作系统/硬件都有这样的文档吗?@ClaudioCorsi:这是一个有趣的想法。一台新电脑可能不会有帮助。任何操作系统都能提供纳秒级的精确时间吗?
买一台新电脑
——不错。我有一个8核的英特尔CPU;我怀疑我需要一台新电脑。我猜这是对Windows的限制。我实际上并不需要纳秒分辨率——但我很惊讶这个值经常是相同的(每天几次)。在你更换旧的之后,我可以用你的吗?@DavidWallace大多数标准操作系统可能不会提供纳秒分辨率,但可能会有一些定制的。这有点开玩笑。我错过了原始问题中他陈述需要的部分,因此我将该建议删去。@kevinarpe如果你愿意使用JNI,你可以打电话访问Windows上的高精度计时器。