天真地用 Clock.systemDefaultZone().millis() 替换 System.currentTimeMillis() 是否安全?

Is it safe to naively replace System.currentTimeMillis() with Clock.systemDefaultZone().millis()?

Java 8 介绍了 java.time.Clock 接口,它应该允许我有效地模拟系统时间调用(太棒了!)。

我想天真地用对 someClock.millis() 的调用替换对 System.currentTimeMillis() 的调用,但我不清楚这两个时钟实际上 return 具有相同的值在所有情况下,都基于 Clock.system* 文档中给出的 caviet,该文档声明他们使用“......最佳可用系统时钟”。 System.currentTimeMillis() 没有指定任何关于使用最佳可用时钟的类似声明。

java.time.SystemClock java.time.Clock 的实现在其 millis() 方法中调用 System.currentTimeMillis(),所以基本上这是相同的,最终所有实现都将 return 时间从gettimeofday系统调用

嗯,不,你不能保证它会完全一样,因为

The system factory methods provide clocks based on the best available system clock. This may use System.currentTimeMillis(), or a higher resolution clock if one is available

所以它明确表示它可能使用更好的时钟,这意味着它绝对可能不同。

即使您分析了所有现有的实现并发现它们都在使用 System.currentTimeMillis(),您也无法明确保证事情会保持这种状态,因此依赖它是无效的。

这是否足够接近您的目的取决于您的应用程序和个人喜好。

答案在于此声明:

.. This may use System.currentTimeMillis(), or a higher resolution clock if one is available.

我觉得进行替换是安全的,这样您就可以尽可能获得更高分辨率的时钟,例如 System.nanoTime()

JDK 9 将具有更高精度的时钟,请参阅问题 8068730。因此,System.currentTimeMillis()Clock.systemUTC().millis() 可能不同。考虑到今天,在 Windows 上,currentTimeMillis returns 是一个低精度值,即使在毫秒级别,它几乎肯定会在 JDK 9 中更好。

保证相同行为的一个选择是自己实现 Clock class,调用 currentTimeMillis.