如何用代码实现真正公平的抽奖?
先来看一个简单的实现:先将50个人进行1到50编号,然后来一段简单的java随机数代码,如下:
上图中的代码运行结果:
大家觉得这个抽奖设计的公平么?欢迎下方留言讨论~
这里介绍一下Random及ThreadLocalRandom相关知识:
int random = ThreadLocalRandom.current().nextInt(50) + 1在java中最直接、简单的调用生成随机数方式:
new Random().nextInt()比如生成0.0到10.0之间的双精度浮点数即:
new Random().nextDouble(10)如果想生成整数即:
new Random().nextInt(10)Random每次使用都得实例化一个对象
多线程下使用单个Random实例生成随机数时候,多个线程同时计算随机数计算新的种子时候多个线程会竞争同一个原子变量的更新操作,由于原子变量的更新是CAS操作,同时只有一个线程会成功,所以会造成大量线程进行自旋重试,这是会降低并发性能的,所以ThreadLocalRandom应运而生。
为了解决多线程高并发下Random的缺陷,JUC包下新增了ThreadLocalRandom类,如果每个线程维护自己的一个种子变量,每个线程生成随机数时候根据自己老的种子计算新的种子,并使用新种子更新老的种子,然后根据新种子计算随机数,就不会存在竞争问题,这会大大提高并发性能。
日常开发中,经常会有生成一批随机数的需求,比如订单号的后4位采用随机数,随机轮询,随机获取系统默认头像等,大家可以在高并发的场景中尝试一下并发包中的ThreadLocalRandom,感兴趣的同学可以去看看相关源码。
少琮持续关注科技领域问答,欢迎大家下方留言讨论,共同成长!感谢点赞、收藏、关注~
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有