《java并发编程之美》第三章(主打一个陪伴学习)

Java并发包中的ThreadLocalRandom类

1.1、Random类

Random是使用最广泛的随机数生成类,它生成随机数的步骤就两步:①获取到老的随机数种子,根据老的随机数种子生成新的随机数种子,新的随机数种子覆盖老的随机数种子;②根据新的随机数种子生成随机数。存在的问题是,在多线程并发的情况下,多个线程可能获取了同一个老的种子,如果不作处理,生成的新的种子是一样的,自然生成的随机数也是一样的,这自然不是我们所希望的。那么,在Random类中所做的处理是,在更新老的随机数种子的时候,是一个CAS的操作,它使得同一时间的并发的线程只有一个能更新成功,能生成随机数。而其它的线程,使做一个自旋的操作,这样不仅会带来cpu的消耗,同时并发的效率大大减低。ThreadLocalRandom类应运而生。

1.2、ThreadLocalRandom类应运而生

它的创建不是new,而是ThreadLocalRandom.current(),可见,它的多线程获取的其实使同一个实例。它的随机数种子不是保存在一个原子性的共享变量里面的,而是每个线程自己维护自己的一个threadLocalRandomSeed,当线程调用ThreadLocalRandom.current()时,ThreadLocalRandom会去为这个线程初始化它的种子。后续拿这个种子去创建随机数即可,因为它的线程级别的变量,每个线程维护自己的变量,不存在并发问题,并不需要上锁。

Java并发编程之美 文章被收录于专栏

本专栏是本人看书——《java并发编程之美》的总结,主要是为自己做一个记录,也欢迎大家评论区留言讨论交流呀~

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务