当前位置:   article > 正文

【并发处理】避免Random实例被多线程使用_避免 random 实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一 seed

避免 random 实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一 seed

避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降,JDK7之后,可以使用ThreadLocalRandom来获取随机数

解释一下竞争同一个seed导致性能下降的原因,比如,看一下Random类nextInt()方法实现:

  1. public int nextInt() {
  2. return next(32);
  3. }

调用了next(int bits)方法,这是一个受保护的方法:

  1. protected int next(int bits) {
  2. long oldseed, nextseed;
  3. AtomicLong seed = this.seed;
  4. do {
  5. oldseed = seed.get();
  6. nextseed = (oldseed * multiplier + addend) & mask;
  7. } while (!seed.compareAndSet(oldseed, nextseed));
  8. return (int)(nextseed >>> (48 - bits));
  9. }

而这边的seed是一个全局变量:

  1. /**
  2. * The internal state associated with this pseudorandom number generator.
  3. * (The specs for the methods in this class describe the ongoing
  4. * computation of this value.)
  5. */
  6. private final AtomicLong seed;

多个线程同时获取随机数的时候,会竞争同一个seed,导致了效率的降低。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/84030
推荐阅读
相关标签
  

闽ICP备14008679号