【问题标题】:How to handle when System.nanoTime() returns the same value between calls?当 System.nanoTime() 在调用之间返回相同的值时如何处理?
【发布时间】:2014-12-22 04:00:11
【问题描述】:

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

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

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

参考资料:

【问题讨论】:

  • @ElliottFrisch - “...我们使用 nanoTime 对跨多个线程到达的事件进行排序...”希望看到您使用 UUID 进行操作。
  • 为什么不使用原子计数器来对线程进行排序呢?
  • 问题到底是什么?您是否正在寻找 nanoTime 的替代品?或者让 nanoTime 为您工作的方法?似乎您的世界模型(在一个滴答声中只发生一件事)不适合 nanoTime。实际上,如果您有多个线程,则无法(没有同步)为这些事件生成严格的时间顺序。
  • “tick”有多大/多长?我是 Windows 上的英特尔 i8。是否有针对每个操作系统/硬件的文档?
  • @ClaudioCorsi:这是一个有趣的想法。

标签: java nanotime


【解决方案1】:

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

此方法提供纳秒级精度,但不一定 纳秒分辨率(即值更改的频率) - 否 除了决议至少与 currentTimeMillis() 的那个。

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

至于你的问题

有哪些方法可以处理 System.nanoTime() 返回相同的内容 调用之间的值?

我建议使用某种 atomic counter,正如 Claudio Corsi 建议的那样。

【讨论】:

  • 一台新电脑可能无济于事。是否有任何操作系统实际上提供了纳秒精度的nanoTime()
  • get a new computer -- 很好。我有一个 8 核 Intel CPU;我怀疑我需要一台新电脑。我猜这是对 Windows 的限制。我实际上并不需要纳秒级分辨率——但我很惊讶这个值的频率是相同的(每天几次)。
  • 你的旧的换掉后我能要吗?
  • @DavidWallace 大多数标准操作系统可能不会提供纳秒级分辨率,但可能有一些自定义操作系统会提供。这是一个有点舌头的脸颊。我错过了原始问题中他陈述需求的部分,所以我编辑了那个建议。
  • @kevinarpe 如果您愿意使用 JNI,您可以调用以访问 Windows 上更高精度的计时器。 msdn.microsoft.com/en-us/library/windows/desktop/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 2018-03-02
相关资源
最近更新 更多