1,多线程
总结下:每一个Random实例里面有一个原子性的种子变量用来记录当前的种子的值,当要生成新的随机数时候要根据当前种子计算新的种子并更新回原子变量。多线程下使用单个Random实例生成随机数时候,多个线程同时计算随机数计算新的种子时候多个线程会竞争同一个原子变量的更新操做,因为原子变量的更新是CAS操做,同时只有一个线程会成功,因此会形成大量线程进行自旋重试,这是会下降并发性能的,因此ThreadLocalRandom应运而生。并发
ThreadLocalRandom.current().ints(100000, 1000000).distinct().limit(6);
ThreadLocalRandom使用ThreadLocal的原理,让每一个线程内持有一个本地的种子变量,该种子变量只有在使用随机数时候才会被初始化,多线程下计算新种子时候是根据本身线程内维护的种子变量进行更新,从而避免了竞争
2,
int num=(int )((Math.random()*9+1)*10000);//随机得到5位数