首页 >后端开发 >C++ >C# 的'Random.Next()”方法是线程安全的吗?我们如何创建线程安全的替代方法?

C# 的'Random.Next()”方法是线程安全的吗?我们如何创建线程安全的替代方法?

Linda Hamilton
Linda Hamilton原创
2025-01-21 02:35:09824浏览

Is C#'s `Random.Next()` Method Thread-Safe, and How Can We Create a Thread-Safe Alternative?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn