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()獲得獨特的價值觀并不是一個好主意。
添加回答
舉報