0

我正在尝试使用 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");
        }
    }
}
4

1 回答 1

2

时钟SystemClock.MONOTONIC最终是基于System.nanoTime(),见源码。后者应该是单调的,至少罕见闰秒的处理在这里是安全的单调的,但在一些多核平台上可能恰好不是单调的,在这些平台上 JVM 难以在内核之间切换以形成一致的结果打电话System.nanoTime()。另请参阅相关的 SO-post,其中包含有关System.nanoTime().

一种解决方法可能是引入一个新常量,该常量部署一个SystemClock.MONOTONIC_ENFORCEDCAS 算法(基于 java.util.concurrent.atomic.AtomicLong如果您在 Time4J 的下一个版本中需要此功能,请告诉我。

于 2020-06-03T12:11:11.260 回答