GNU/Linux >> Belajar Linux >  >> Linux

Akankah System.currentTimeMillis selalu mengembalikan nilai >=panggilan sebelumnya?

Itu tidak mungkin dijamin akan meningkat, berdasarkan fakta bahwa pengguna berpotensi mengubah waktu sistem di antara panggilan.

Selain itu, itu harus tetap meningkat karena mewakili milidetik sejak zaman. Jika ini adalah "waktu dinding" normal, Anda harus khawatir tentang perubahan waktu pada hari kabisat atau pergantian waktu musim panas.


Tidak, tidak selalu>=semua panggilan sebelumnya.

  • Ini mungkin tidak bertambah setiap kali jika Anda memanggilnya beberapa kali berturut-turut dengan cepat dari utas yang sama (Saya tahu ini =bagian dari>=, tetapi perilaku ini sering mengejutkan orang).

  • Jika Anda memanggilnya beberapa kali berturut-turut dengan cepat dari beberapa utas, itu mungkin melakukan banyak hal -- itu bisa mundur sedikit di seluruh utas dengan jumlah yang sangat kecil, bergantung pada penerapan dan peluang acak.

  • Yang paling serius, nilainya mungkin kembali ke masa lalu dalam jumlah besar jika pengguna (jarang) atau sinkronisasi NTP (kemungkinan umum) menyesuaikan jam sistem.


Jawaban singkatnya adalah tidak, System.currentTimeMillis() adalah tidak monoton. Ini didasarkan pada waktu sistem, dan karenanya dapat mengalami variasi baik (maju atau mundur) dalam hal penyesuaian jam (misalnya melalui NTP).

System.nanoTime() monoton, jika dan hanya jika platform dasarnya mendukung CLOCK_MONOTONIC -- lihat komentar di laporan bug Java 6458294 untuk artikel yang bagus tentang beberapa keadaan di mana ini benar/tidak benar.

(Dan, sebagai anekdot tambahan, saya pribadi telah mengamati (beberapa kali) System.currentTimeMillis() jalankan 'mundur', dengan tidak adanya penyesuaian jam, melintasi utas - yaitu, panggilan ke metode itu di satu utas mengembalikan nilai yang lebih rendah daripada panggilan di utas lainnya, meskipun itu terjadi secara kronologis setelahnya di 'real-time ')

Jika Anda membutuhkan sumber yang monoton, System.nanoTime() pada platform yang mendukung kemonotonan adalah pilihan terbaik Anda.


Linux
  1. Perintah Untuk Mengeluarkan Konten File Ke Stdout?

  2. Bagaimana cara mendapatkan nilai pengembalian dari PROSES ANAK?

  3. Mengapa fungsi utama tanpa pernyataan pengembalian mengembalikan nilai 12?

  1. Mengembalikan nilai x =os.system(..)

  2. Nilai pengembalian fungsi batas waktu

  3. Akankah sistem saya fsck ketika saya reboot?

  1. Cara Melihat Tanggal dan Waktu Reboot Sistem Linux

  2. Perbedaan antara panggilan sistem statvfs() dan statfs()?

  3. Panggilan Sistem di windows &Native API?