大家好我有一段看起来像这样的代码:
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 应该是单调递增的-如果你有两次调用它,A并B和A之前发生B的话A <= B.但在实践中,你实际上可以观察nanoTime到"倒退".
nanoTime由CPU上的内部计数器决定,其开始时间基本上是任意的(这就是为什么它不能用来确定挂钟时间).这可能会导致多核环境出现问题,因为一个核心的内部计时器可能与另一个核心的起点不同.Hotspot试图弥补这一点,但并不总是成功,因此事实上你可以nanoTime在某些情况下看到倒退.
有一个最近的讨论这个并发-interest邮件列表上.具体见本电子邮件可链接到这个bug报告,以及该电子邮件其中谈到了解决方法(这似乎并没有工作,虽然我不知道为什么).错误报告有相当多的细节.