首頁 >後端開發 >C++ >C# 的「Random.Next()」方法是線程安全的嗎?

C# 的「Random.Next()」方法是線程安全的嗎?

Linda Hamilton
Linda Hamilton原創
2025-01-21 02:35:09857瀏覽

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