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中文網其他相關文章!