C#的Random.Next()
方法线程安全吗?
发布于 2010-06-16 06:19:19
在Next
方法中没有做任何特殊的事情来实现线程安全。然而,它是一个实例方法。如果您不跨不同的线程共享Random
的实例,则不必担心实例中的状态损坏。在没有持有某种排它锁的情况下,不要跨不同的线程使用Random
的单个实例。
Jon Skeet在这个主题上有几个很好的帖子:
正如一些评论员所指出的,在使用不同的Random
实例时存在另一个潜在的问题,这些实例是线程独占的,但是被相同地播种,因此导致相同的伪随机数序列,因为它们可能是在同一时间创建的,或者彼此在时间上非常接近。缓解该问题的一种方法是使用主Random
实例(由单个线程锁定)来生成一些随机种子,并初始化新的Random
实例,供每个其他线程使用。
发布于 2010-06-16 06:28:52
不,它不是线程安全的。如果你需要从不同的线程使用同一个实例,你必须同步使用。
不过,我真的看不出你有什么理由需要它。对于每个线程来说,拥有自己的Random类实例会更有效率。
发布于 2011-03-16 07:48:57
另一种线程安全的方法是使用ThreadLocal<T>
,如下所示:
new ThreadLocal<Random>(() => new Random(GenerateSeed()));
每次调用GenerateSeed()
方法时,它都需要返回一个唯一的值,以确保随机数序列在每个线程中是唯一的。
static int SeedCount = 0;
static int GenerateSeed() {
return (int) ((DateTime.Now.Ticks << 4) +
(Interlocked.Increment(ref SeedCount)));
}
将适用于少量线程。
https://stackoverflow.com/questions/3049467
复制相似问题