赞
踩
避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降,JDK7之后,可以使用ThreadLocalRandom来获取随机数
解释一下竞争同一个seed导致性能下降的原因,比如,看一下Random类的nextInt()
方法实现:
- public int nextInt() {
- return next(32);
- }
调用了next(int bits)方法,这是一个受保护的方法:
- protected int next(int bits) {
- long oldseed, nextseed;
- AtomicLong seed = this.seed;
- do {
- oldseed = seed.get();
- nextseed = (oldseed * multiplier + addend) & mask;
- } while (!seed.compareAndSet(oldseed, nextseed));
- return (int)(nextseed >>> (48 - bits));
- }
而这边的seed是一个全局变量:
- /**
- * The internal state associated with this pseudorandom number generator.
- * (The specs for the methods in this class describe the ongoing
- * computation of this value.)
- */
- private final AtomicLong seed;
多个线程同时获取随机数的时候,会竞争同一个seed,导致了效率的降低。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。