java - SplittableRandom.split() 线程安全吗?

标签 java multithreading random thread-safety

我正在开发一个网络应用程序,我需要为每个请求生成一个随机数。该请求将命中一组存储桶中的特定存储桶。为给定桶生成的随机数应该具有均匀分布。我计划使用一个具有 SplittableRandom 实例的 map 来对抗像这样的存储桶 id

buketId -> SplittableRandom

为了处理网络请求,我首先检查请求中指定的bucketId。然后我选择相应的 SplittableRandom 实例并对其调用 split() 。在重负载下 split() 方法将由多个线程在同一实例上调用。这种方法线程安全吗?

最佳答案

来自 javadoc

Instances of SplittableRandom are not thread-safe. They are designed to be split, not shared, across threads. For example, a java.util.concurrent.ForkJoinTask fork/join-style computation using random numbers might include a construction of the form new Subtask(aSplittableRandom.split()).fork().

split() 方法基于 this 返回一个新的 SplittableRandom 实例。

public SplittableRandom split() {
    return new SplittableRandom(nextLong(), mixGamma(nextSeed()));
}

mixGamma() 方法是线程安全的,但会调用 nextSeed()(均在 split() 中) nextLong())则不然,因为它们修改非 volatile 长种子而没有任何同步机制。

关于java - SplittableRandom.split() 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41823667/

相关文章:

java - 如何使用 XPath 通过另一个属性的值过滤元素?

c# - WinForms 应用程序分析

c - 查看随机序列中的下四个数字(使用 srand 和 rand)

Java RMI - 检查注册表是否存在

java - 从静态 block 调用静态方法

java - 我使用泛型,但不是 This Class<T> 东西!

后台线程中的 ASP.NET 异常处理

android - Looper 还是 while 在线程中?

math - 不使用位操作的随机数生成

C# 生成随机 IP 地址