// 【此情况极少出现,但不可不防,这意味着1个毫秒内,JVM要执行此方法达到4096次,我这个电脑执行远达不到 。】
if(sequence == 0) {
currTime = unitNextTime();
}
} else {
//如果不是与lastTime一样,则表示进入了下一个毫秒,则sequence重新计数
sequence = 0L;
}
//3. 把当前时间赋值给 lastTime, 以便下一次判断是否处在同一个毫秒内
lastTimeStamp = currTime;
//4. 依次把各个部门求出来并通过逻辑或 拼接起来
return (this.lastTimeStamp << timeStampShift) | //把当前系统时间 左移22位
(this.dataCenterId << dataCenterIdShift) | //把机房编号 左移17位
(this.computerId << computerIdShift) | //把计算机号编号左移 12位
this.sequence; //最后的序列号占12位,无需移动
}
/******
* 等待毫秒数进入下一个时间
* @return
*/
private long unitNextTime() {
//1.再次获取系统时间
long timestamp = getCurrentTime();
//2. 判断 lastTime与currentTime是否一样
while(timestamp <= lastTimeStamp) {
//2.1 继续获取系统时间,直到上面的条件不成立为止
timestamp = getCurrentTime();
}
//3. 返回
return timestamp;
}
/*****
* 用来获取当前的系统时间,以毫秒为单位
* @return
*/
private long getCurrentTime() {
return System.currentTimeMillis();
}
}
测试类
public class UseIdGenerator {
/****
【雪花算法】* 主方法
* @param args
*/
public static void main(String[] args) {
//这里两个参数都是1,表示1号机房和1号电脑【在分布式系统中,每个电脑知道自己所在的机房和编号】
IdGenerator ig = new IdGenerator(1,1);
//循环生成
long result = -1;
for(int i = 0;i<100000;i++) {
result = ig.nextId();
System.out.println(result+" , "+Long.toBinaryString(result));
}
}
}
推荐阅读
- 分布式 id 生成算法 twitter snowflake 算法
- 算法|又一家大型国企公司招聘,年薪大概10万起,工龄工资三年将调一次
- 算法|清华博士只值50块时薪?差点凑不齐学费,网友表示不能理解
- 雕刻|一块冰种雪花棉翡翠片料,雕刻观音大牌,作品一出来大家都惊叹,太漂亮了!
- 算法|职场中,没有人帮助的时候,人脉就是自己最大的保障
- 裁员|“随机裁员”潮来了!Meta用算法随机炒掉60名员工 没有任何理由
- 算法系列之接雨水
- 算法|网信办公示互联网信息服务算法备案信息:抖音、淘宝等算法原理公开
- 高级排序算法之快速排序
- Flink中的State概念及其扩容算法 state是什么意思