首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >time4j在很长一段时间内不会产生单调时间

time4j在很长一段时间内不会产生单调时间
EN

Stack Overflow用户
提问于 2020-06-03 16:02:18
回答 1查看 53关注 0票数 0

我正在尝试使用下面的测试代码使用time4j v5.6在长时间内生成单调时间

但产出并不是预期的。我是否错过了库的任何初始化?我的目标是产生单调的时间,但不需要很高的精度,因为这可以在客户端执行linux/windows

代码语言:javascript
复制
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");
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 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中需要此功能,请让我知道。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62167962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档