C# 随机数生成中的线程安全保障
在多线程应用程序中,确保关键资源或方法的线程安全至关重要。在 C# 中,常用的随机数生成工具 Random.Next()
方法的线程安全性令人担忧。
C# 的随机数生成器是线程安全的吗?
否,从多个线程同时并发使用 Random.Next()
不是线程安全的。这会导致不可预测的行为,甚至可能产生不正确的结果。问题的根本原因在于,多个线程可能尝试同时修改同一个 Random
实例的内部状态,导致值损坏甚至完全失败,只返回 0。
创建线程安全的随机数生成器
虽然 Random.Next()
本身不是线程安全的,但可以创建一个线程安全的版本,而无需对每次方法调用都使用复杂的锁定机制。通过利用一篇外部文章中介绍的技术,我们可以实现一个自定义的 ThreadSafeRandom
类:
<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>
解释
ThreadSafeRandom
类通过为每个线程维护单独的 Random
实例来确保线程安全。这防止了线程相互干扰彼此的内部状态。但是,存在一个需要注意的地方:在非常接近的时间内(大约 15 毫秒内)创建多个 Random
实例可能会导致相同的随机数序列。为了解决这个问题,我们引入了一个全局静态 Random
实例(_global
),用于为每个线程的本地 Random
实例(_local
)生成种子值。
以上是C# 的'Random.Next()”方法是线程安全的吗?我们如何创建线程安全的替代方法?的详细内容。更多信息请关注PHP中文网其他相关文章!