ThreadLocalRandom类原理

本文探讨了Random类的局限性,重点解析了ThreadLocalRandom的实现机制,包括Unsafe、current()方法和nextInt()方法的工作原理,展示了如何通过ThreadLocal避免多线程中的种子竞争,提高并发性能。
摘要由CSDN通过智能技术生成

这是一个随机数生成器,而我们比较常用的是Random类,但是它是有一定的局限性。首先看一下Random生成随机数过程

Random类实现及局限

我们常用的一个方法是Random.nextInt(),那就以它作为例子:

public int nextInt (int bound) {
	if (bound <= 0)
		throw new IllealArgumentException(BadBound);
		
	//(1)根据老种子生成新种子
	int r = next(31);
	//根据新种子计算随机数
	...
	return r;
}

总结为两个步骤:

  • 首先根据老种子生成新种子
  • 根据新种子计算新的随机数

此处最关键的就是生成新种子的过程,因为根据种子生成随机数的算法是固定的。若多个线程都获得了同一个老种子,那么多个线程就会生成同一个新种子,也就会生成同样的随机数。因此要保证代码(1)的原子性,只有一个线程能够根据旧的种子获得新种子,那样其他线程就会丢掉自己获得的老种子而使用上一个线程的新种子来计算自己的新种子。Random函数使用了一个原子变量达到了这个效果。看一下next()的代码:

protected int next(int bits) {
        long oldseed, nextseed;
        AtomicLong seed = this.seed;
        do {
            oldseed = seed.get();			//获得旧的seed
            nextseed = (oldseed * multiplier 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值