在 Java 中创建唯一的时间戳

2022-09-03 08:46:03

我需要在Java中创建一个时间戳(以毫秒为单位),该时间戳保证在该特定VM实例中是唯一的。即,需要某种方法来限制 System.currentTimeMillis() 的吞吐量,以便它每毫秒最多返回一个结果。关于如何实现这一点的任何想法?


答案 1

这将使时间尽可能接近当前时间,而不会重复。

private static final AtomicLong LAST_TIME_MS = new AtomicLong();
public static long uniqueCurrentTimeMS() {
    long now = System.currentTimeMillis();
    while(true) {
        long lastTime = LAST_TIME_MS.get();
        if (lastTime >= now)
            now = lastTime+1;
        if (LAST_TIME_MS.compareAndSet(lastTime, now))
            return now;
    }
}

避免每毫秒一个 ID 限制的一种方法是使用微秒时间戳。即,将当前时间MS乘以1000。这将允许每毫秒 1000 个 id。

注意:如果时间倒退,例如由于NTP校正,则每次调用时间将以1毫秒的速度前进,直到时间赶上。;)


答案 2

您可以使用以获得更高的准确性System.nanoTime()

尽管我在下面尝试过,并且每次它都给出不同的值,但它可能不能保证始终是唯一的。

public static void main(String[] args) {
        long time1 = System.nanoTime();
        long time2 = System.nanoTime();
        long time3 = System.nanoTime();
        System.out.println(time1);
        System.out.println(time2);
        System.out.println(time3);
    }

另一种方法是使用/类作为唯一数字,如果时间对你来说不重要,你只需要唯一的数字,这可能是一个更明智的选择。AtomicIntegerAtomicLong