在内部,java.util.Random与当前种子保持AtomicLong,并且每当请求一个新的随机数时,就存在更新种子的争用。
从java.util.Random的实现中:
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));}
另一方面,ThreadLocalRandom通过每个线程有一个种子来确保种子更新而不会面临任何争用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)