package com.zhitan.common.utils.id;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
/**
|
* longid
|
* @author Geoffrey
|
* @date 2024/12/31
|
*/
|
public class IncrLongIdUtil {
|
|
private static final int INCR_PART_LIMIT_VALUE = 10000;
|
private static final AtomicInteger ID_INCR_PART_TEMP = new AtomicInteger(INCR_PART_LIMIT_VALUE);
|
private static final StringBuffer ID_BUILDER = new StringBuffer();
|
private static transient long baseTime = System.currentTimeMillis() / 1000;
|
private static final String DATA_CENTER_ID = "0"; // 0-9
|
|
public static synchronized long nextLongId() {
|
ID_BUILDER.setLength(0);
|
long currentTime = System.currentTimeMillis() / 1000;
|
if (currentTime > baseTime) {
|
ID_INCR_PART_TEMP.set(INCR_PART_LIMIT_VALUE);
|
baseTime = currentTime;
|
}
|
int index = ID_INCR_PART_TEMP.incrementAndGet();
|
if (index >= (INCR_PART_LIMIT_VALUE * 10 - 1)) {
|
if (currentTime == baseTime) {
|
try {
|
Thread.sleep(1000);
|
currentTime = System.currentTimeMillis() / 1000;
|
baseTime = currentTime;
|
} catch (InterruptedException e) {
|
// do nothing
|
}
|
}
|
ID_INCR_PART_TEMP.set(INCR_PART_LIMIT_VALUE);
|
}
|
String longStr = ID_BUILDER.append(currentTime).append(DATA_CENTER_ID).append(index).toString();
|
return Long.parseLong(longStr);
|
}
|
}
|