1 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
太長(zhǎng)了;如果您僅在現(xiàn)代操作系統(tǒng)上的流行虛擬機(jī)上使用單線程,那么它在實(shí)踐中可能會(huì)起作用。但許多嚴(yán)肅的應(yīng)用程序使用多個(gè)線程和應(yīng)用程序的多個(gè)實(shí)例,在這種情況下不會(huì)有任何保證。
Javadoc中對(duì) System.nanoTime() 給出的唯一保證是時(shí)鐘的分辨率至少與System.currentTimeMillis()
- 因此,如果您正在編寫(xiě)跨平臺(tái)代碼,顯然不希望 的結(jié)果nanoTime
是唯一的,因?yàn)槊亢撩肟梢哉{(diào)用nanoTime()
多次。
在我的操作系統(tǒng)(Java 11、MacOS)上,同一線程上的連續(xù)調(diào)用之間總是至少有一納秒的差異(這是在 Integer.MAX_VALUE 查看連續(xù)返回值之后);實(shí)施中可能有一些東西可以保證這一點(diǎn)。
然而,如果您使用多個(gè)線程并且擁有超過(guò) 1 個(gè)物理 CPU,則很容易生成重復(fù)結(jié)果。下面的代碼將向您展示:
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");
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
此外,當(dāng)您將應(yīng)用程序擴(kuò)展到多臺(tái)計(jì)算機(jī)時(shí),您可能會(huì)遇到同樣的問(wèn)題。
依靠System.nanoTime()獲得獨(dú)特的價(jià)值觀并不是一個(gè)好主意。
添加回答
舉報(bào)