这是一篇描述随机数线程安全性的好文章:以线程安全的方式获取随机数 http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx
但我坚持使用“RandomGen2”示例:
public static class RandomGen2
{
private static Random _global = new Random();
[ThreadStatic]
private static Random _local;
public static int Next()
{
Random inst = _local;
if (inst == null)
{
int seed;
lock (_global) seed = _global.Next();
_local = inst = new Random(seed);
}
return inst.Next();
}
}
为什么线程静态字段被复制到局部变量:Random inst = _local; ?为什么不简单地使用
if (_local == null)
....
return _local.Next()
注意:自从写这个答案以来,我已经意识到创建多个问题Random
实例,尽管听起来应该可行。我通常发现更好的选择是有一个Random
实例并锁定它。尽管这是一个潜在的瓶颈,但most应用程序不会引起问题。
我怀疑这只是为了避免多次读取线程静态变量的成本。它是相对地与读取局部变量相比,这样做效率很低。
你的建议可行,但效率会稍微低一些,仅此而已。在其他情况下,在读取之间值可能会发生变化 - 但当然在这种情况下这不是问题,因为它是线程局部变量。
对于 .NET 4 及更高版本,使用以下命令会更简单ThreadLocal<T>
:
public static class RandomGen2
{
private static Random _global = new Random();
private static ThreadLocal<Random> _local = new ThreadLocal<Random>(() =>
{
int seed;
lock (_global) seed = _global.Next();
return new Random(seed);
});
public static int Next()
{
return _local.Value.Next();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)