微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

并发使用java.util.Random的争用

Oracle Java documentation说:

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保持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通过每个线程有一个种子来确保种子更新而不面对任何争用.

原文地址:https://www.jb51.cc/java/122966.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐