并发测试Twitter snowflake id,顺带测试了下几种list set的性能和线程安全性

final int threadC = 300;
		final int loopC = 1000;
		
		//final Set<Long> idCounter = Sets.newConcurrentHashSet();
		final List<Long> idCounter = new ArrayList<>(threadC*loopC);
		final IdWorker idWorker = new IdWorker(0, 0);
		final CountDownLatch latch = new CountDownLatch(threadC*loopC);

		for (int j=0; j<threadC; j++)
		{
			new Thread(new Runnable() {
				public void run() {
					
					for (int i = 0; i < loopC; i++) {
						long id = idWorker.nextId();
						idCounter.add(id);
						latch.countDown();
					}
					
				}
			}).start();
		}
		
		long st = System.currentTimeMillis();
		latch.await();
		long en = System.currentTimeMillis();
		System.out.println("idCounter:"+idCounter.size()+",T:"+(en-st));


new ArrayList<>(),执行结果:你猜?java.lang.ArrayIndexOutOfBoundsException: 10 ,应该是动态扩容线程不安全造成。

new ArrayList<>(threadC*loopC),执行结果:idCounter:285572,T:103 ,设置固定容量后,不抛异常了。从数据看,好明显线程不安全,导致统计数据不正确。

Lists.newCopyOnWriteArrayList() ,执行结果:idCounter:300000,T:54015,线程安全,但执行性能巨差。

最后出大杀器,Sets.newConcurrentHashSet();  执行结果:idCounter:300000,T:88,线程安全,性能很好。

--------------------

调整下参数        final int threadC = 1000;         final int loopC = 10000;

idCounter:10000000,T:6409

6秒生成了一千万个不重复id,是不是很牛?


再调整下参数,充分利用下机器资源,性能大幅提高           final int threadC = 9000;         final int loopC = 1000;

idCounter:9000000,T:687  700毫秒生成了900万个不重复id,牛逼大了!













Snowflake算法是Twitter开源的一个分布式ID生成算法,用于生成全局唯一的ID。它的高并发性能主要体现在以下几个方面: 1. 算法生成ID的速度非常快。Snowflake算法生成ID的方式是将时间戳、工作机器ID、序列号等信息合并成一个64位的数字,使得每个ID都是唯一的。而这些信息很容易被快速的获取并组合为一个新的ID。 2. 分布式ID生成。Snowflake算法是一种分布式ID生成算法,每个机器都会有一个唯一的工作机器ID,而使用不同的工作机器ID可以让不同的机器生成不同的ID,从而避免生成重复的ID,同时也方便了分布式环境下的数据管理。 3. 高度并发的情况下依然能够保证ID的唯一Snowflake算法的实现中序列号的最高位是保留位,可以根据业务需要配置。当高并发情况下,如果序列号达到最大值,系统会进入等待状态,直到下一毫秒。这样就可以保证高并发情况下的ID唯一,并不会出现重复ID的情况。 然而,Snowflake算法在单点故障问题上也存在一些不足之处。因为工作机器ID部分使用硬编码,所以如果ID生成器所在的机器宕机,那么这些ID生成机器也无法提供服务,会造成整个ID生成器系统的单点故障。为了解决这个问题,可以使用多个ID生成器,每个生成器包含多个ID服务端点,通过负载均衡的方式将请求分散到不同的ID服务端点上,从而提高整个ID生成器系统的可用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值