GNU/Linux >> Znalost Linux >  >> Linux

Vrátí System.currentTimeMillis vždy hodnotu >=předchozí volání?

Nelze to zaručit narůstat na základě skutečnosti, že uživatel by mohl potenciálně změnit systémový čas mezi hovory.

Kromě toho by to mělo roste, protože představuje milisekundy od epochy. Pokud by to byl normální „čas na stěně“, museli byste si dělat starosti se změnami času v přestupný den nebo při přechodu na letní čas.


Ne, nebudou to vždy>=všechny předchozí hovory.

  • Nemusí se pokaždé zvýšit, pokud jej zavoláte několikrát rychle za sebou ze stejného vlákna (vím, že toto je část =část>=, ale toto chování lidi často překvapuje).

  • Pokud jej zavoláte několikrát v rychlém sledu z více vláken, může to udělat mnoho věcí – může se vrátit v čase napříč vlákny o velmi malou částku, v závislosti na implementaci a náhodné náhodě.

  • Nejvážnější je, že hodnota se může vrátit v čase o velkou hodnotu, pokud uživatel (vzácné) nebo synchronizace NTP (potenciálně běžné) upraví systémové hodiny.


Krátká odpověď je ne, System.currentTimeMillis() není monotóní. Je založeno na systémovém čase, a proto se může v případě úprav hodin (např. přes NTP) měnit v obou směrech (vpřed nebo vzad).

System.nanoTime() je monotónní právě tehdy, když základní platforma podporuje CLOCK_MONOTONIC -- podívejte se na komentáře k hlášení o chybě Java 6458294, kde najdete dobrý popis některých okolností, kdy to je/není pravda.

(A jako další anekdotu jsem osobně pozoroval (několikrát) System.currentTimeMillis() spustit 'zpětně', při absenci úprav hodin, napříč vlákny -- to znamená, že volání této metody v jednom vlákně vrátilo nižší hodnotu než volání v jiném vlákně, i když k němu došlo chronologicky po něm v 'reálném čase ')

Pokud potřebujete monotónní zdroj, System.nanoTime() na platformě podporující monotónnost je vaše nejlepší volba.


Linux
  1. Rozdíl mezi systémovými voláními statvfs() a statfs()?

  2. Jak získat návratovou hodnotu z CHILD PROCESS?

  3. Systémová volání ve Windows a nativní API?

  1. Nastavte systémové datum a čas pomocí C++ v Linuxu

  2. návratová hodnota z python skriptu do shell skriptu

  3. Může eBPF upravit návratovou hodnotu nebo parametry syscall?

  1. Je oddíl /boot vždy nutný?

  2. Dočasně změnit čas

  3. Vrácená hodnota funkce časového limitu