1 回答
TA贡献1797条经验 获得超6个赞
太长了;如果您仅在现代操作系统上的流行虚拟机上使用单线程,那么它在实践中可能会起作用。但许多严肃的应用程序使用多个线程和应用程序的多个实例,在这种情况下不会有任何保证。
Javadoc中对 System.nanoTime() 给出的唯一保证是时钟的分辨率至少与System.currentTimeMillis()
- 因此,如果您正在编写跨平台代码,显然不希望 的结果nanoTime
是唯一的,因为每毫秒可以调用nanoTime()
多次。
在我的操作系统(Java 11、MacOS)上,同一线程上的连续调用之间总是至少有一纳秒的差异(这是在 Integer.MAX_VALUE 查看连续返回值之后);实施中可能有一些东西可以保证这一点。
然而,如果您使用多个线程并且拥有超过 1 个物理 CPU,则很容易生成重复结果。下面的代码将向您展示:
public class UniqueNano {
private static volatile long a = -1, b = -2;
public static void main(String[] args) {
long max = 1_000_000;
new Thread(() -> {
for (int i = 0; i < max; i++) { a = System.nanoTime(); }
}).start();
new Thread(() -> {
for (int i = 0; i < max; i++) { b = System.nanoTime(); }
}).start();
for (int i = 0; i < max; i++) {
if (a == b) {
System.out.println("nanoTime not unique");
}
}
}
}
此外,当您将应用程序扩展到多台计算机时,您可能会遇到同样的问题。
依靠System.nanoTime()获得独特的价值观并不是一个好主意。
添加回答
举报