java random 重复_Java ThreadLocalRandom产生重复随机数问题

看源代码:

public static ThreadLocalRandom current() {

//如果线程第一次调用 current() 方法,执行 localInit()方法

if (UNSAFE.getInt(Thread.currentThread(), PROBE) == 0)

localInit();

return instance;

}

localInit方法:

static final void localInit() {

int p = probeGenerator.addAndGet(PROBE_INCREMENT);

int probe = (p == 0) ? 1 : p; // skip 0

long seed = mix64(seeder.getAndAdd(SEEDER_INCREMENT));

Thread t = Thread.currentThread();

UNSAFE.putLong(t, SEED, seed);

UNSAFE.putInt(t, PROBE, probe);

}

生成随机数时:

public int nextInt(int bound) {

if (bound <= 0)

throw new IllegalArgumentException(BadBound);

//第一处

int r = mix32(nextSeed());

int m = bound - 1;

if ((bound & m) == 0) // power of two

r &= m;

else { // reject over-represented candidates

for (int u = r >>> 1;

u + m - (r = u % bound) < 0;

u = mix32(nextSeed()) >>> 1)

;

}

return r;

}

final long nextSeed() {

Thread t; long r; // read and update per-thread seed

UNSAFE.putLong(t = Thread.currentThread(), SEED,

r = UNSAFE.getLong(t, SEED) + GAMMA);

return r;

}

在主线程调用了 TreadLocalRandom 的 current() 方法,把主线程和主线程的 seed 存入了 UNSAFE。非主线程和 seed 的键值对之前并没有存入 UNSAFE。

所以直接ThreadLocalRandom.current().nextInt()去用。current()方法不会产生多个实例,放心用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值