在关闭显示的情况下, 可以达到每毫秒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");
}
}

Twitter Snowflake 的Java实现的更多相关文章

  1. snowflake算法(java版)

     转自:http://www.cnblogs.com/haoxinyue/p/5208136.html 1. 数据库自增长序列或字段 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方 ...

  2. 唯一ID算法之:snowflake(Java版本)

    Twitter开源的算法,简单易用. /** * Twitter_Snowflake<br> * SnowFlake的结构如下(每部分用-分开):<br> * 0 - 0000 ...

  3. 【Java】分布式自增ID算法---雪花算法 (snowflake,Java版)

    一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. 方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID.这种呢,优点是可以体现全局的递增 ...

  4. 雪花算法(SnowFlake)Java实现

    分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种. 算法原理 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1bit,不用,因为二 ...

  5. 通过rest接口获取自增id (twitter snowflake算法)

    1.  算法介绍 参考 http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8%87%AA%E5%A2%9Eid%E7%AE% ...

  6. Twitter的分布式自增ID算法snowflake (Java版)

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...

  7. Twitter雪花算法 SnowFlake算法 的java实现

    概述 SnowFlake算法是Twitter设计的一个可以在分布式系统中生成唯一的ID的算法,它可以满足Twitter每秒上万条消息ID分配的请求,这些消息ID是唯一的且有大致的递增顺序. 原理 Sn ...

  8. Twitter雪花算法SnowFlake算法的java实现

    https://juejin.im/post/5c75132f51882562276c5065 package javaDemo; /** * twitter的snowflake算法 -- java实 ...

  9. 详解Twitter开源分布式自增ID算法snowflake(附演算验证过程)

    详解Twitter开源分布式自增ID算法snowflake,附演算验证过程 2017年01月22日 14:44:40 url: http://blog.csdn.net/li396864285/art ...

随机推荐

  1. objective-c系列-@Property&点语法

    //解释 property后边的圆括号中的修饰词的含义: //          nonatomic  非线程安全  非原子操作  特点是: 操作变量的效率高 //          atomic   ...

  2. 委托 C#

    这些就是自己的理解. 委托的用处就是把方法传递给其他方法. 1委托的使用更类差不多,也 是需要先定义再实例化. 2Action<T>和Func<T>委托 3多播委托 4.匿名方 ...

  3. iOS-H5学习篇-01

    什么是HTML? HTML 是用来描述网页的一种语言. 0.HTML 指的是超文本标记语言 1.HTML 不是一种编程语言,而是一种标记语言 2.标记语言是一套标记标签 3.HTML 使用标记标签来描 ...

  4. C#问题

    1.结构体里面是否可以有属性? 可以有属性.实测代码以及截图. In C#, we can use the following statement to convert a string s to a ...

  5. JavaScript Lib Interface (JavaScript系统定义的接口一览表)

    function Object(){}; Object.prototype.toString = function(){return "";}; Object.prototype. ...

  6. form.submit() not a function的元凶

    今天晚上学习jquery form plugin时,在明白了该插件的用法时, (1)该插件是将form的HTTP请求 改为AJax请求. (2)支持像jQuery.ajax(options)一样 的o ...

  7. Solr术语介绍:SolrCloud,单机Solr,Collection,Shard,Replica,Core之间的关系

    Solr有一堆让人发晕的术语如:collections,shards,replicas,cores,config sets. 在了解这些术语之前需要先做做如下功课: 1)什么是倒排索引? 2)搜索引擎 ...

  8. Codevs 1025 选菜

    题目描述 Description 在小松宿舍楼下的不远处,有PK大学最不错的一个食堂--The Farmer's Canteen(NM食堂).由于该食堂的菜都很不错,价格也公道,所以很多人都喜欢来这边 ...

  9. Android 的提权 (Root) 原理是什么?

    作者:Kevin链接:https://www.zhihu.com/question/21074979/answer/18176410来源:知乎著作权归作者所有,转载请联系作者获得授权. Android ...

  10. linux线程同步(5)-屏障

    一.概述                                                    barrier(屏障)与互斥量,读写锁,自旋锁不同,它不是用来保护临界区的.相反,它跟条 ...