首页 技术 正文
技术 2022年11月9日
0 收藏 659 点赞 4,327 浏览 1876 个字

在关闭显示的情况下, 可以达到每毫秒3万个的生成速度

/**
* An Implementation of Twitter Snowflake ID Generator
*/
public class SnowflakeId {
private final static long EPOCH = 0L; // shift for smaller timestamp
private final static long DEVICE_ID_BITS = 2L;
private final static long SEQUENCE_BITS = 16L;
private final static long MAX_WORKER_ID = -1L ^ -1L << DEVICE_ID_BITS; // 与& 非~ 或| 异或^, only the bit on WORKER_ID_BITS are 1
private final static int SEQUENCE_MASK = (int)(-1L ^ -1L << SEQUENCE_BITS); private final long deviceId;
private final RecyclableAtomicInteger atomic = new RecyclableAtomicInteger();
private long lastTimestamp = -1L; public SnowflakeId(final long deviceId) {
if (deviceId > MAX_WORKER_ID || deviceId < 0) {
throw new IllegalArgumentException(
String.format("Device ID should be between 0 and %d", this.MAX_WORKER_ID));
}
this.deviceId = deviceId;
} public long nextId() {
long timestamp = millisecond();
if (timestamp < lastTimestamp) {
throw new IllegalArgumentException(
String.format("Wait %d milliseconds", lastTimestamp - timestamp));
} if (lastTimestamp == timestamp) {
int sequence = atomic.incrementAndRecycle(SEQUENCE_MASK);
if (sequence == 0) {
timestamp = waitTilNextMillis(lastTimestamp);
lastTimestamp = timestamp;
}
return (timestamp - EPOCH << (SEQUENCE_BITS + DEVICE_ID_BITS)) | (deviceId << SEQUENCE_BITS) | sequence;
} else {
atomic.set(0);
lastTimestamp = timestamp;
return (timestamp - EPOCH << (SEQUENCE_BITS + DEVICE_ID_BITS)) | (deviceId << SEQUENCE_BITS);
}
} private long waitTilNextMillis(final long lastTimestamp) {
System.out.print(lastTimestamp);
long timestamp;
for (;;) {
timestamp = this.millisecond();
System.out.print('+');
if (timestamp > lastTimestamp) {
System.out.print("\n");
return timestamp;
}
}
} private long millisecond() {
return System.currentTimeMillis();
} public static void main(String[] args) {
SnowflakeId worker = new SnowflakeId(1);
long start = System.currentTimeMillis();
for (int i = 0; i < 5000000; i ++) {
//System.out.println(worker.nextId());
worker.nextId();
}
long duration = System.currentTimeMillis() - start;
System.out.println("Total: " + duration + "ms, " + 5000000/duration + "/ms");
}
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,085
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,560
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,409
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,182
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,819
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,902