Is it valid to share one instance of the Random
class between multiple threads? And to call nextInt(int)
from multiple threads in particular?
相关问题
- Delete Messages from a Topic in Apache Kafka
- Jackson Deserialization not calling deserialize on
- How to maintain order of key-value in DataFrame sa
- StackExchange API - Deserialize Date in JSON Respo
- Difference between Types.INTEGER and Types.NULL in
As said, it is thread save, but it may be wise to use
java.util.concurrent.ThreadLocalRandom
according to this article (link dead). ThreadLocalRandom is also a subclass of Random, so it is backwards compatible.Here's how I dealt with the problem without assuming that Random uses atomic variables. It can still randomly collide if
currentTime * thread id
is equal some time in the future, but that's rare enough for my needs. To truly avoid the possibility of collisions, you could have each request wait for a unique clock timestamp.There's no reason multiple threads can't all use the same Random. However, since the class is not explicitly thread-safe and maintains a sequence of pseudo-random numbers via the seed. Multiple threads may end up with the same random number. It would be better to create multiple Randoms for each thread and seed them differently.
EDIT: I've just noticed that the Sun implementation uses AtomicLong so i guess that is Thread-safe (as also noted by Peter Lawrey (+1)).
EDIT2: OpenJDK also uses AtomicLong for the seed. As others have said though it's still not good to rely on this.
Acording to the documentation, Math.random() guarantees it's safe for use by multiple threads. But the Random class does not. I would assume then you'll have to synchronize that yourself.
The
Random
class is not set up for one instance to be used in multiple threads. Ofcourse, if you did this, likely you will increase the possibility of getting un-predictable and closer to random numbers. But since it is a pseudo-random generator, I cannot see why you would need to share an instance. Is there a more specific requirement?Yes, Random is thread safe. the
nextInt()
method calls the protectednext(int)
method which usesAtomicLong seed, nextseed
(atomic long) to generate a next seed.AtomicLong
is used for thread-safety upon seed generation.