小编典典

System.currentTimeMillis是否将始终返回> =先前调用的值?

linux

https://docs.oracle.com/javase/6/docs/api/java/lang/System.html#currentTimeMillis()说:

返回当前时间(以毫秒为单位)。请注意,虽然返回值的时间单位是毫秒,但该值的粒度取决于基础操作系统,并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

我不确定我是否可以保证此代码将始终打印出不断增加(或相同)的数字。

while (1) { 
    System.out.println(System.currentTimeMillis() );
}

阅读 347

收藏
2020-06-02

共1个答案

小编典典

简短的回答是否定的,System.currentTimeMillis()不是
单调的。它基于系统时间,因此在时钟调整(例如,通过NTP)的情况下,可能会以任何方式(向前或向后)变化。

System.nanoTime()当且仅当基础平台支持时,它是单调的CLOCK_MONOTONIC-
在某些情况下(不是),请参见Java错误报告6458294上的注释,以获得良好的撰写

(而且,作为一个额外的轶事,我个人观察到(几次)System.currentTimeMillis()在没有时钟调整的情况下跨线程运行“向后”-也就是说,在一个线程中对该方法的调用返回的值比调用低在另一个线程中,即使它是按时间顺序在“实时”之后发生的)

如果需要单调源,则System.nanoTime()在支持单调性的平台上是您的最佳选择。

2020-06-02