GNU/Linux >> Linux の 問題 >  >> Linux

System.currentTimeMillis は常に値 >=以前の呼び出しを返しますか?

おそらく保証できない ユーザーが通話間のシステム時間を変更する可能性があるという事実に基づいて、増加する可能性があります。

それに加えて、すべき エポックからのミリ秒を表すため、増加し続けます。通常の「ウォール タイム」であれば、うるう日や夏時間の切り替えによる時間の変更について心配する必要があります。


いいえ、以前のすべての呼び出しが常に>=であるとは限りません。

  • 同じスレッドから立て続けに数回呼び出すと、毎回増加するとは限りません (これが>=の =の部分であることはわかっていますが、その動作はしばしば人々を驚かせます)。

  • 複数のスレッドから立て続けに数回呼び出すと、さまざまな処理が行われる可能性があります。実装とランダムな可能性に応じて、スレッド間で時間がわずかに戻る可能性があります。

  • 最も深刻なことに、ユーザー (まれ) または NTP 同期 (潜在的に一般的) がシステムクロックを調整すると、値が大幅に時間を遡る可能性があります。


短い答えはノー、System.currentTimeMillis() です。 ではない 単調。これはシステム時間に基づいているため、(NTP などによる) クロック調整の場合、いずれかの方向 (順方向または逆方向) に変動する可能性があります。

System.nanoTime() 基盤となるプラットフォームが CLOCK_MONOTONIC をサポートしている場合に限り、単調です。 -- Java バグ レポート 6458294 のコメントを参照して、これが正しい/正しくないいくつかの状況に関する適切な記事を参照してください。

(そして、追加の逸話として、私は個人的に (数回) System.currentTimeMillis() スレッド全体で、クロック調整がない場合に「逆方向」に実行します。つまり、あるスレッドでのそのメソッドへの呼び出しは、別のスレッドでの呼び出しよりも低い値を返しました。 ')

単調なソースが必要な場合は、System.nanoTime() 単調性をサポートするプラットフォーム上での使用が最良の選択肢です。


Linux
  1. statvfs() と statfs() システムコールの違いは?

  2. CHILD PROCESSから戻り値を取得するには?

  3. Windows とネイティブ API のシステム コール?

  1. RDTSC を使用して CPU サイクルを取得する - RDTSC の値が常に増加するのはなぜですか?

  2. Linux で C++ を使用してシステムの日付と時刻を設定する

  3. Pythonスクリプトからシェルスクリプトへの戻り値

  1. straceを使用したLinuxでのシステムコールの理解

  2. ファイルの内容をStdoutに出力するコマンド?

  3. eBPF は syscall の戻り値またはパラメーターを変更できますか?