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

标签 java multithreading performance concurrency contention

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

关于java - 并发使用 java.util.Random 的争用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22313552/

相关文章:

java - 时间轴动画JavaFX

java - Spring websocket 30分钟后自动关闭(超时)

multithreading - 为每个对象加载生成一个新线程

performance - OAuth 性能

mysql - InnoDB 中 MyISAM 的 key_buffer_size 是多少?

java - Android UI 中的相对位置

java - JPanel 内的 JTable 位于 JScrollPane 内,带有 GridBagLayout,看起来不正常

c - 我的多线程应用程序的逻辑?

java - Java线程-保持函数与线程的多个返回值同步

mysql - 服务器特定的超慢 SQL 更新命令