GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wird System.currentTimeMillis immer einen Wert >=vorherige Aufrufe zurückgeben?

Es kann unmöglich garantiert werden zu erhöhen, basierend auf der Tatsache, dass der Benutzer möglicherweise die Systemzeit zwischen Anrufen ändern könnte.

Abgesehen davon sollte es Bleiben Sie steigend, da es Millisekunden seit der Epoche darstellt. Wenn es eine normale "Wandzeit" wäre, müssten Sie sich um Zeitumstellungen am Schalttag oder bei der Umstellung auf Sommerzeit kümmern.


Nein, es sind nicht immer>=alle vorherigen Aufrufe.

  • Es erhöht sich möglicherweise nicht jedes Mal, wenn Sie es mehrmals schnell hintereinander aus demselben Thread aufrufen (ich weiß, dass dies der =-Teil von>=ist, aber das Verhalten überrascht die Leute oft).

  • Wenn Sie es mehrmals schnell hintereinander von mehreren Threads aus aufrufen, kann es eine beliebige Anzahl von Dingen tun - es könnte über Threads hinweg um einen sehr kleinen Betrag in der Zeit etwas zurückgehen, abhängig von der Implementierung und dem zufälligen Zufall.

  • Am schwerwiegendsten ist, dass der Wert möglicherweise um einen großen Betrag zurückgeht, wenn der Benutzer (selten) oder eine NTP-Synchronisierung (möglicherweise häufig) die Systemuhr anpasst.


Die kurze Antwort ist nein, System.currentTimeMillis() ist nicht monoton. Sie basiert auf der Systemzeit und kann daher bei Uhrzeitanpassungen (z. B. über NTP) in beide Richtungen (vorwärts oder rückwärts) variieren.

System.nanoTime() ist monoton, wenn und nur wenn die zugrunde liegende Plattform CLOCK_MONOTONIC unterstützt -- siehe die Kommentare zum Java-Fehlerbericht 6458294 für eine gute Beschreibung einiger Umstände, in denen dies zutrifft/nicht zutrifft.

(Und als zusätzliche Anekdote habe ich persönlich (mehrmals) System.currentTimeMillis() beobachtet läuft 'rückwärts', ohne Zeitanpassungen, über Threads hinweg - das heißt, ein Aufruf dieser Methode in einem Thread hat einen niedrigeren Wert zurückgegeben als ein Aufruf in einem anderen Thread, obwohl er chronologisch danach in 'Echtzeit' erfolgte ')

Wenn Sie eine monotone Quelle benötigen, System.nanoTime() auf einer Plattform, die Monotonie unterstützt, ist die beste Option.


Linux
  1. So zeigen Sie das Datum und die Uhrzeit des Neustarts des Linux-Systems an

  2. Rückgabewert von x =os.system(..)

  3. Stellen Sie Systemdatum und -zeit mit C++ unter Linux ein

  4. Rückgabewert vom Python-Skript zum Shell-Skript

  5. Kann eBPF den Rückgabewert oder die Parameter eines Systemaufrufs ändern?

Systemzeit

Was sind Linux-Systemaufrufe und Bibliotheksfunktionen?

CPU-Zyklen mit RDTSC erhalten - warum steigt der Wert von RDTSC immer?

Ist eine /boot-Partition immer notwendig?

Zeit vorübergehend ändern

Wird mein System fsck, wenn ich neu starte?