首頁 > 後端開發 > C++ > C# 的 Random.Next() 是執行緒安全的嗎?

C# 的 Random.Next() 是執行緒安全的嗎?

Susan Sarandon
發布: 2025-01-21 02:51:17
原創
801 人瀏覽過

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

C#隨機數產生器中的線程安全問題

在軟體開發中,確保在多執行緒環境中安全存取共享資源至關重要。 C#的Random.Next()方法用於產生隨機數,但其線程安全性值得探討。

Random.Next()是執行緒安全的嗎?

不是。如果多個執行緒同時使用同一個Random.Next()實例,可能會導致不可預測的行為,甚至可能產生一系列零值。

建立執行緒安全的隨機數產生器

為了建立Random類別的執行緒安全版本,建議採用以下方法:

<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實例來實現執行緒安全性。當新執行緒存取該類別時,它會從全域Random實例產生一個種子值,確保每個執行緒的序列唯一。

解決Random的細微問題

Random類別還有一個特性:如果多個實例在短時間內(15毫秒內)創建,它們可能會傳回相同的序列。為了減輕這個問題,使用全域Random實例來產生種子,防止衝突。

結論:

了解C# Random.Next()的執行緒安全限制並實作執行緒安全版本,可以確保在多執行緒應用程式中可靠地產生隨機數。

以上是C# 的 Random.Next() 是執行緒安全的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板