-System.nanoTime()+ System.nanoTime()保证> = 0?

Pac*_*ier 13 java time

大家好我有一段看起来像这样的代码:

public class Test {
    public static void main(String args[]) {
        long a = System.currentTimeMillis(); // line 1
        long b = System.currentTimeMillis(); // line 2
        assert b - a >= 0;

        long y = System.nanoTime(); // line 5
        long z = System.nanoTime(); // line 6
    }
}
Run Code Online (Sandbox Code Playgroud)

所以IERS表示下一个闰秒将在2012年6月30 11:59.9 之后立即发生.

我想知道我是否对,如果第1行在2012年6月30 之后的0.9秒运行11:59.9转到2012年7月1 00:00.0,

第2行在第1行后的0.1秒运行,

结果b - a可能是否定的?(-900毫秒)

如果是这种情况,如果第5行在2012年6月30 之后的0.9秒运行11:59.9转到2012年7月1 00:00.0,

第5行在第5行后的0.1秒运行,

结果z - y可能是否定的?(-900,000,000纳秒?)

ysh*_*vit 10

System.nanoTime 应该是单调递增的-如果你有两次调用它,ABA之前发生B的话A <= B.但在实践中,你实际上可以观察nanoTime到"倒退".

nanoTime由CPU上的内部计数器决定,其开始时间基本上是任意的(这就是为什么它不能用来确定挂钟时间).这可能会导致多核环境出现问题,因为一个核心的内部计时器可能与另一个核心的起点不同.Hotspot试图弥补这一点,但并不总是成功,因此事实上你可以nanoTime在某些情况下看到倒退.

有一个最近的讨论这个并发-interest邮件列表上.具体见本电子邮件可链接到这个bug报告,以及该电子邮件其中谈到了解决方法(这似乎并没有工作,虽然我不知道为什么).错误报告有相当多的细节.