37. Using pseudo-random generators in a thread-safe fashion (multithreaded environments)
Random
and SecureRandom
instances are thread-safe. While this statement is true, pay attention that when a Random
instance (or Math.random()
) is used by multiple threads (multithreaded environment), your code is prone to thread contention because these threads share the same seed. Sharing the same seed involves synchronization of the seed access; therefore, it opens the door to thread contention. Obviously, thread contention leads to performance penalties, since threads may wait in the queue to gain access to the seed. Synchronization is typically expensive.
An alternative to Random
is ThreadLocalRandom
, which uses a Random
instance for each thread and provides protection against thread contention, since it doesn’t contain synchronized code or atomic operations. The downside is that ThreadLocalRandom
uses an internal seed per thread that we cannot control or modify.
SplittableRandom...