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()); } }
最近下载更多
tyoui1125 LV1
5月16日
jsonobject LV1
2021年8月27日
zhangtiwei LV3
2021年6月29日
qq514725355 LV1
2020年7月28日
vvsoul LV1
2020年5月7日
zhuweidong LV1
2020年1月9日
847417825 LV2
2019年12月19日
daliao2008 LV6
2019年12月11日
coldzera LV4
2019年7月16日
fyqing LV1
2018年12月11日
最近浏览更多
dapeng0011 LV15
7月17日
tyoui1125 LV1
5月16日
shinyHe LV1
2022年4月12日
zhangtiwei LV3
2021年6月29日
nextstep LV11
2021年6月7日
JobsJames LV2
2020年11月22日
terryang LV19
2020年9月25日
qq514725355 LV1
2020年7月28日
lililiqqqq LV1
2020年6月2日
vvsoul LV1
2020年5月7日