gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:08:25 32 4
gpt4 key购买 nike

我正在开发一个网络应用程序,我需要为每个请求生成一个随机数。该请求将命中一组存储桶中的特定存储桶。为给定桶生成的随机数应该具有均匀分布。我计划使用一个具有 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com