Jawaban ini ditulis pada tahun 2011 dari sudut pandang apa yang sebenarnya dilakukan oleh Sun JDK pada sistem operasi saat itu. Itu sudah lama sekali! jawaban leventov menawarkan perspektif yang lebih mutakhir.
Posting itu salah, dan nanoTime
aman. Ada komentar pada posting yang menghubungkan ke posting blog oleh David Holmes , seorang pria realtime dan concurrency di Sun. Ia mengatakan:
System.nanoTime () diimplementasikan menggunakan API QueryPerformanceCounter / QueryPerformanceFrequency [...] Mekanisme default yang digunakan oleh QPC ditentukan oleh lapisan Abstraksi Perangkat Keras (HAL) [...] Default ini berubah tidak hanya di seluruh perangkat keras tetapi juga di seluruh OS versi. Misalnya Windows XP Paket Layanan 2 mengubah hal-hal untuk menggunakan timer manajemen daya (PMTimer) daripada penghitung timestamp prosesor (TSC) karena masalah dengan TSC yang tidak disinkronkan pada prosesor yang berbeda dalam sistem SMP, dan karena faktanya frekuensinya dapat bervariasi (dan karenanya hubungannya dengan waktu yang berlalu) berdasarkan pengaturan manajemen daya.
Jadi, pada Windows, ini merupakan masalah hingga WinXP SP2, tetapi tidak sekarang.
Saya tidak dapat menemukan bagian II (atau lebih) yang berbicara tentang platform lain, tetapi artikel itu tidak menyertakan komentar bahwa Linux telah mengalami dan memecahkan masalah yang sama dengan cara yang sama, dengan tautan ke FAQ untuk clock_gettime (CLOCK_REALTIME) , yang mengatakan:
- Apakah clock_gettime (CLOCK_REALTIME) konsisten di semua prosesor / inti? (Apakah lengkungan itu penting? Mis. Ppc, arm, x86, amd64, sparc).
Ini seharusnya atau itu dianggap kereta.
Namun, pada x86 / x86_64, dimungkinkan untuk melihat TSC freq yang tidak disinkronkan atau variabel menyebabkan inkonsistensi waktu. 2.4 kernel benar-benar tidak memiliki perlindungan terhadap hal ini, dan kernel 2.6 awal tidak terlalu baik di sini. Pada 2.6.18 dan lebih tinggi dari logika untuk mendeteksi ini lebih baik dan kami biasanya akan kembali ke sumber data yang aman.
ppc selalu memiliki timebase yang disinkronkan, sehingga seharusnya tidak menjadi masalah.
Jadi, jika tautan Holmes dapat dibaca sebagai menyiratkan nanoTime
panggilan itu clock_gettime(CLOCK_REALTIME)
, maka itu aman pada kernel 2.6.18 pada x86, dan selalu pada PowerPC (karena IBM dan Motorola, tidak seperti Intel, benar-benar tahu cara mendesain mikroprosesor).
Sayangnya, tidak disebutkan SPARC atau Solaris. Dan tentu saja, kami tidak tahu apa yang IBM JVM lakukan. Tapi Sun JVM di Windows dan Linux modern bisa melakukannya dengan benar.
EDIT: Jawaban ini didasarkan pada sumber yang dikutipnya. Tetapi saya masih khawatir bahwa itu mungkin benar-benar salah. Beberapa informasi terbaru akan sangat berharga. Saya baru saja menemukan tautan ke artikel empat tahun yang lebih baru tentang jam Linux yang dapat bermanfaat.