我需要生成monotonically increasing个整数。
我可以使用时间戳以某种方式生成这种类型的整数序列吗?
我会一次请求一个整数,并且我不会在同一秒的间隔内请求超过一个整数 - 如果我这样做,我不介意它是否在该秒的间隔内传递了相同的整数。
答案 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;
}
}