java 编写序列_java如何编写类似oracle自增序列的算法?
如果你的这个值是用来做数据库的表数据唯一标识的话,建议可以用twitter idworker的算法,支持分布式部署生成,性能极高,也是支持排序的。package com.idworker;
public class IdWorker {
private final long workerId;
private final static long twepoch = 1288834974657L;
private long sequence = 0L;
private final static long workerIdBits = 4L;
public final static long maxWorkerId = -1L ^ -1L << workerIdBits;
private final static long sequenceBits = 10L;
private final static long workerIdShift = sequenceBits;
private final static long timestampLeftShift = sequenceBits + workerIdBits;
public final static long sequenceMask = -1L ^ -1L << sequenceBits;
private long lastTimestamp = -1L;
public IdWorker(final long workerId) {
super();
if (workerId > this.maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format(
"worker Id can't be greater than %d or less than 0",
this.maxWorkerId));
}
this.workerId = workerId;
}
public synchronized long nextId() {
long timestamp = this.timeGen();
if (this.lastTimestamp == timestamp) {
this.sequence = (this.sequence + 1) & this.sequenceMask;
if (this.sequence == 0) {
System.out.println("###########" + sequenceMask);
timestamp = this.tilNextMillis(this.lastTimestamp);
}
} else {
this.sequence = 0;
}
if (timestamp < this.lastTimestamp) {
try {
throw new Exception(
String.format(
"Clock moved backwards. Refusing to generate id for %d milliseconds",
this.lastTimestamp - timestamp));
} catch (Exception e) {
e.printStackTrace();
}
}
this.lastTimestamp = timestamp;
long nextId = ((timestamp - twepoch << timestampLeftShift))
| (this.workerId << this.workerIdShift) | (this.sequence);
System.out.println("timestamp:" + timestamp + ",timestampLeftShift:"
+ timestampLeftShift + ",nextId:" + nextId + ",workerId:"
+ workerId + ",sequence:" + sequence);
return nextId;
}
private long tilNextMillis(final long lastTimestamp) {
long timestamp = this.timeGen();
while (timestamp <= lastTimestamp) {
timestamp = this.timeGen();
}
return timestamp;
}
private long timeGen() {
return System.currentTimeMillis();
}
public static void main(String[] args){
IdWorker worker2 = new IdWorker(2);
System.out.println(worker2.nextId());
}
}
java 编写序列_java如何编写类似oracle自增序列的算法?相关推荐
- java 注解校验_Java开发编写自定义校验注解和校验器
自定义校验 1).编写一个自定义的校验注解 2).编写一个自定义的校验器 ConstraintValidator 3).关联自定义的校验器和自定义的校验注解 * @Documented * @Cons ...
- java代码抛出异常_Java中编写代码出现异常,如何抛出异常,如何捕获异常
异常的产生过程解析 先运行下面的程序,程序会产生一个数组索引越界异常ArrayIndexOfBoundsException.我们通过图解来解析下异常产生的过程. 工具类 classArrayTools ...
- java 滚动小球_Java语言编写一个程序:在面板中多个小球浮动,碰到边缘则反弹,小球和小球想撞得话,其中一个就消失...
编写一个窗体的类BallFrameDemo: package com.lzy.ball; import javax.swing.JFrame; public class BallFrameDemo e ...
- java爬虫编写步骤_JAVA爬虫--编写第一个网络爬虫程序
JAVA爬虫–编写第一个网络爬虫程序 前言上一章节介绍了XPATH基础语法,本章节将手把手带大家编写第一个爬虫程序,同时也希望能通过这个爬虫程序,帮助大家熟悉上一章节学习的XPATH基础语法并运用到实 ...
- java 面试代码_java代码编写及面试题
/*//字符串逆向输出 //第一种 String string="abcdef"; for (int i = string.length()-1; i >=0; i--) { ...
- java swing 代码_java swing编写gui生命游戏代码,新手上路
项目描述 生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量.如果相邻方格活着 ...
- java 单元测试 异步_Java/Android编写异步的单元测试用例
不写单元测试用例的程序员不是一个好CTO!!! 注:以下内容编码环境为AndroidStudio_2.4Preview6,测试框架 JUnit4.12 今天在研究 MVP_RxJava2_Retrof ...
- java代码快速_java代码编写快捷途经
Ctrl+R 然后按下R键=SHift+Alt+R:对选定属性进行全局命名 Ctrl+D:删除当前行 Ctrl+Q: 定位到最后编辑的地方 Ctrl+L: 定位在某行 Ctrl+M: 最大化当前的 ...
- java线程 睡眠_java如何编写线程睡眠工具类包括随机睡眠时长
最后给大家贴下这个睡眠工具类的完整代码 public class Sleep { /** * 睡眠n毫秒 * @param time */ public static void threadSleep ...
- java jsp四则运算_java web编写四则运算
首先先画出一个表 pageEncoding="UTF-8"%> 四则运算 四则运算 你想要的题目数量 οnchange="checkti(a1)"> ...
最新文章
- R语言data.table进行滚动数据连接,滚动连接通常用于分析涉及时间的数据(例如商业销售活动和对应的广告投放的安排之之间的关系)实战:实战和动画说明滚动数据连接的形式及方法
- Elasticlunr.js 简单介绍
- kafka 脚本发送_NWPC消息平台:在ecFlow系统中发送产品事件消息
- neo4j数据浏览器_Neo4j:在Neo4j浏览器的帮助下探索新数据集
- [转]Windows 下 Apache Virtual hosts 简单配置
- 2022考研数学一/二/三汤老师接力题典1800(解答册及题目册)pdf版
- 前端技术文档及工具汇总
- 【转载】深入浅出讲解FOC算法与SVPWM技术——自制FOC驱动器
- Java 拾遗补阙 ----- Switch case语句
- 用Python多线程抓取并验证代理
- 整理了18个可以免费学习编程的网站
- python打印上下标
- LottieAnimationView怎么重置为第一帧
- 在 Linux中 cp复制文件时,出现略过的提示
- python爬房源信息_python爬虫获取链家二手房源信息
- 最新Lua网络验证系统+lua代码/PHP后端开发
- 百度经纬度和google经纬度转换测试
- 浪潮存储与虚拟服务器连接失败,浪潮-异构虚拟化存储研究(示例代码)
- win7开机启动项设置_Win7系统电脑使用注册表查看开机启动项操作方法
- Bakkt能否开启下一轮牛市?这篇「Bakkt专访」一窥究竟
热门文章
- local class incompatible: stream classdesc serialVersionUID = -3129896799942729832, local class seri
- word之无法插入公式,公式图标灰色
- 内存为程序分配空间的四种分配方式
- 定义一个类描述分数,并提供加减乘除运算 以及分数化简
- 帧、采样率、Hz、比特率
- adsl modem的内置命令(viking)
- Python安装包及初步认知
- 所谓的AI芯片到底指什么?
- 李广难封–有感于团队建设
- 联想u盘启动linux,联想ThinkPad L540笔记本BIOS设置u盘启动教程