生成单调递增的整数

时间:2012-01-16 05:57:24

标签: java

我需要生成monotonically increasing个整数。

我可以使用时间戳以某种方式生成这种类型的整数序列吗?

我会一次请求一个整数,并且我不会在同一秒的间隔内请求超过一个整数 - 如果我这样做,我不介意它是否在该秒的间隔内传递了相同的整数。

3 个答案:

答案 0 :(得分:3)

您可以使用AtomicInteger对象来维护线程安全计数器。然后在需要下一个整数时使用getAndIncrement()

答案 1 :(得分:1)

由于单调增加的整数不需要是连续的(即只要数字不断增加就可能存在间隙),并且听起来你希望在同一秒内进行的所有调用都返回相同< / em> integer,一个返回JVM已启动多少秒的方法可以很好地完成。

这是一个简单的实现:

private static long startTime = System.currentTimeMillis();

public static int secondsSinceStart() {
    return (int) TimeUnit.SECONDS.convert(
        System.currentTimeMillis() - startTime, TimeUnit.MILLISECONDS);
}

仅供参考,这将持续68年才能延期。

答案 2 :(得分:0)

这是我自制的发电机...

  public final class IdGenerator {

  private static final int MAGNITUDE = 10000;
  private static long previousTimestamp;

  private static int counter = 0;

  private IdGenerator() {
  }

  public synchronized static long generateId() {
    final long timeMillis = System.currentTimeMillis();
    if (previousTimestamp != timeMillis) {
      counter = 0;
    }
    previousTimestamp = timeMillis;

    final int counterValue = counter++;
    if (counterValue >= MAGNITUDE) {
      //just to be sure
      throw new IllegalStateException("too many id generated for a single timestamp!");
    }

    return timeMillis * MAGNITUDE + counterValue;
  }

}