Is C#'s Random.Next() https://learn.microsoft.com/en-us/dotnet/api/system.random.next#overloads方法线程安全吗?
不,从多个线程使用同一个实例可能会导致它中断并返回全 0。但是,创建一个线程安全版本(不需要在每次调用时使用令人讨厌的锁)Next()
)很简单。改编自中的想法本文 http://web.archive.org/web/20160326010328/http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx:
public class ThreadSafeRandom
{
private static readonly Random _global = new Random();
[ThreadStatic] private static Random _local;
public int Next()
{
if (_local == null)
{
int seed;
lock (_global)
{
seed = _global.Next();
}
_local = new Random(seed);
}
return _local.Next();
}
}
这个想法是保持一个单独的static Random
每个线程的变量。然而,由于另一个问题,以明显的方式做到这一点失败了Random
- 如果几乎同时创建多个实例(约15ms以内),它们都会返回相同的值!为了解决这个问题,我们创建了一个全局静态的Random
实例来生成每个线程使用的种子。
顺便说一下,上面的文章有代码演示了这两个问题Random
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)