Contention in concurrent use of java.util.Random
Oracle Java Documentation says:
Instances of java.util.Random are threadsafe. However, the concurrent use of the same java.util.Random instance across threads may encounter contention and consequent poor performance. Consider instead using ThreadLocalRandom in multithreaded designs.
穷人表现背后的原因是什么?
在内部,java.util.random使用当前种子保持原子长度,并且每当请求一个新的随机数时,在更新种子时就会发生争用。
从java.util.random的实现中:
1 2 3 4 5 6 7 8 9 | 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通过每个线程有一个种子来确保在不面临任何争用的情况下更新种子。
随机类围绕内部状态持有一个同步锁,这样只有一个线程可以一次访问它——具体来说,它使用
可以使用
请注意,如果正确实现,除非运行大量线程,否则