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

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

Linda Hamilton
发布: 2025-01-21 02:35:09
原创
874 人浏览过

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 类:

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();
    }
}
登录后复制

解释

ThreadSafeRandom 类通过为每个线程维护单独的 Random 实例来确保线程安全。这防止了线程相互干扰彼此的内部状态。但是,存在一个需要注意的地方:在非常接近的时间内(大约 15 毫秒内)创建多个 Random 实例可能会导致相同的随机数序列。为了解决这个问题,我们引入了一个全局静态 Random 实例(_global),用于为每个线程的本地 Random 实例(_local)生成种子值。

以上是C# 的'Random.Next()”方法是线程安全的吗?我们如何创建线程安全的替代方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板