随机数Random
//获取5以内的随机数
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 10; i++) {
//1、获取随机数
System.out.println(random.nextInt(5));
}
}
public int nextInt(int bound) {
//1.1、判断边界值是否小于等于0
if (bound <= 0) {
//1.2、是抛出异常
throw new IllegalArgumentException(BadBound);
}
//1.3、获取老的种子数获取新的种子数
int r = next(31);
int m = bound - 1;
//1.4、根据新的种子值获取随机数
if ((bound & m) == 0) // i.e., bound is a power of 2
r = (int)((bound * (long)r) >> 31);
else {
for (int u = r;
u - (r = u % bound) + m < 0;
u = next(31))
;
}
return r;
}
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
//1.4.1、获取当前种子值
oldseed = seed.get();
//1.4.2、根据当前种子值算出新的种子值
nextseed = (oldseed * multiplier + addend) & mask;
//1.4.3、使用CAS操作将当前的种子值替换为新的种子值,保证其他线程可以获取到的是新种子值
} while (!seed.compareAndSet(oldseed, nextseed));
//返回新的种子值
return (int)(nextseed >>> (48 - bits));
}
- 注释:1.4.3这里因为使用的是原子操作,在多个线程操作时,会出现多个线程对其进行争抢,导致会有大量线程进行自旋重试,会降低性能。