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.