并发测试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,牛逼大了!













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值