GNU/Linux >> Linux Esercitazione >  >> Linux

System.currentTimeMillis restituirà sempre un valore >=chiamate precedenti?

Non potrebbe essere garantito essere crescente, in base al fatto che l'utente potrebbe potenzialmente modificare l'ora di sistema tra le chiamate.

Inoltre, dovrebbe rimanere in aumento poiché rappresenta i millisecondi dall'epoca. Se fosse un normale "orario di riferimento", dovresti preoccuparti dei cambi di orario nei giorni bisestili o nel passaggio all'ora legale.


No, non sarà sempre>=tutte le chiamate precedenti.

  • Potrebbe non aumentare ogni volta se lo chiami più volte in rapida successione dallo stesso thread (so che questa è la parte =di>=, ma il comportamento spesso sorprende le persone).

  • Se lo chiami più volte in rapida successione da più thread, potrebbe fare un numero qualsiasi di cose:potrebbe tornare leggermente indietro nel tempo tra i thread di una quantità molto piccola, a seconda dell'implementazione e della possibilità casuale.

  • Più seriamente, il valore potrebbe tornare indietro nel tempo di una grande quantità se l'utente (raro) o una sincronizzazione NTP (potenzialmente comune) regola l'orologio di sistema.


La risposta breve è no, System.currentTimeMillis() non monotono. Si basa sull'ora di sistema e quindi può essere soggetta a variazioni in entrambe le direzioni (in avanti o indietro) in caso di regolazioni dell'orologio (ad es. tramite NTP).

System.nanoTime() è monotona, se e solo se la piattaforma sottostante supporta CLOCK_MONOTONIC -- vedi i commenti sulla segnalazione di bug Java 6458294 per un buon resoconto su alcune circostanze in cui questo è/non è vero.

(E, come ulteriore aneddoto, ho osservato personalmente (più volte) System.currentTimeMillis() eseguito "all'indietro", in assenza di regolazioni dell'orologio, attraverso i thread, ovvero una chiamata a quel metodo in un thread ha restituito un valore inferiore rispetto a una chiamata in un altro thread, anche se si è verificata cronologicamente dopo di esso in "tempo reale ')

Se hai bisogno di una fonte monotona, System.nanoTime() su una piattaforma che supporta la monotonia è l'opzione migliore.


Linux
  1. Differenza tra le chiamate di sistema statvfs() e statfs()?

  2. Come ottenere un valore di ritorno da CHILD PROCESS?

  3. Chiamate di sistema in Windows e API native?

  4. Perché una funzione principale senza un'istruzione return restituisce il valore 12?

  5. Ottenere cicli di cpu utilizzando RDTSC:perché il valore di RDTSC aumenta sempre?

Comprensione delle chiamate di sistema su Linux con strace

Ora di sistema

Comando per inviare il contenuto del file a Stdout?

Come visualizzare la data e l'ora di riavvio del sistema Linux

Che cosa sono le chiamate di sistema Linux e le funzioni di libreria?

dmesg time vs system time time non è corretto