我正在尝试使用下面的测试代码使用time4j v5.6在长时间内生成单调时间
但产出并不是预期的。我是否错过了库的任何初始化?我的目标是产生单调的时间,但不需要很高的精度,因为这可以在客户端执行linux/windows
import net.time4j.SystemClock;
import java.time.Instant;
public class MonotonicClock {
public static void main(String[] args) {
SystemClock systemClock = SystemClock.MONOTONIC;
long t1 = systemClock.currentTimeInMicros() * 1000;
boolean failed = false;
for (int i = 0; i < 1000_000; i++) {
long t2 = systemClock.currentTimeInMicros() * 1000;
if (t2 < t1) {
System.out.println(Instant.ofEpochSecond(0, t2) + "<" + Instant.ofEpochSecond(0, t1));
failed = true;
}
t1 = t2;
}
if(failed) {
System.err.println("Test Failed");
}else {
System.out.println("Test Passed");
}
}
}发布于 2020-06-03 20:11:11
时钟SystemClock.MONOTONIC最终基于System.nanoTime(),参见source code。后一个应该是单调的,至少在这里对罕见的闰秒的处理是安全的单调的,但在一些多核平台上,它可能碰巧不是单调的,因为在这些平台上,System.nanoTime()很难在核心之间切换以形成一致的调用System.nanoTime()的结果。另请参阅related SO-post,其中包含有关System.nanoTime()单调性的讨论的更多有用链接。
一个解决方法可能是引入一个新的常量SystemClock.MONOTONIC_ENFORCED,它部署了一个CAS算法(基于java.util.concurrent.atomic.AtomicLong)来比较实际的纳米时间与以前的纳米时间(可能会造成性能损失)。如果您在下一版本的Time4J中需要此功能,请让我知道。
https://stackoverflow.com/questions/62167962
复制相似问题