C#随机数生成器的线程安全性
C#中的Random.Next()
方法是否线程安全,允许多个线程并发使用?答案是不幸的,不是。在多个线程中使用同一个实例可能会导致数据损坏,表现为返回连续的0。
幸运的是,无需对每次Next()
调用都使用繁琐的锁,就可以创建一个线程安全的变体。借鉴一篇有启发性的文章中提出的概念,我们提供一个解决方案:
<code class="language-csharp">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(); } }</code>
这种方法的核心是为每个线程维护一个单独的静态Random
实例。但即使是这个简单的实现也面临另一个陷阱。当多个实例在很短的时间内(大约15毫秒)初始化时,它们会默认为相同的序列。为了解决这个问题,我们引入一个全局静态Random
实例,专门用于为各个线程生成种子。
上面提到的文章提供了说明性代码,详细说明了这两个考虑因素,并提供了关于C#中Random
的复杂性的深入指导。
以上是C# 的 Random.Next() 是线程安全的吗?我们如何才能做到这一点?的详细内容。更多信息请关注PHP中文网其他相关文章!