大家好我有一段看起来像这样的代码:
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报告,以及该电子邮件其中谈到了解决方法(这似乎并没有工作,虽然我不知道为什么).错误报告有相当多的细节.
归档时间: |
|
查看次数: |
4667 次 |
最近记录: |