我可以在多个线程中使用相同的scala.util.Random对象吗?
答案 0 :(得分:3)
PRNG的一个重要特征是给予相同种子时的重复性。想象一下,当您启动它时,您的代码会遇到异常或崩溃。您想重复该行为,以便您可以调试该问题。如果您自己控制种子,则可以在调试问题时反复使用相同的种子启动程序。如果从单个线程访问生成器,它将看到给定种子的相同序列。如果从许多线程访问它,您将无法控制每个线程访问生成器的顺序,因此它们将看到序列的不同子集。所以你可能不想利用Random的线程安全性,即使你可以依赖它。
答案 1 :(得分:0)
我完全同意@BenJackson,但我认为重要的是要提到 scala.util.Random
是线程安全的。作为@tc。在评论中提到,scala.util.Random
只是 java.util.Random
的包装器。正如 Is Random class thread safe? 的许多答案所阐述的那样,它表明它是线程安全的,但在 this comment 中有一个指向 javadoc 的链接,指出:
java.util.Random
的实例是线程安全的。但是,跨线程并发使用同一个 java.util.Random 实例可能会遇到争用,从而导致性能不佳。考虑在多线程设计中使用 ThreadLocalRandom。
因此,只要您使用 JDK 7 或更高版本,它就是线程安全的。