C#隨機數產生器的執行緒安全性
C#中的Random.Next()
方法是否執行緒安全,允許多個執行緒並發使用?答案是不幸的,不是。在多個執行緒中使用同一個實例可能會導致資料損壞,表現為傳回連續的0。
幸運的是,無需對每次Next()
呼叫都使用繁瑣的鎖,就可以創建一個線程安全的變體。借鑒一篇啟發性的文章中提出的概念,我們提供一個解決方案:
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(); } }
這種方法的核心是為每個執行緒維護一個單獨的靜態Random
實例。但即使是這個簡單的實作也面臨另一個陷阱。當多個實例在很短的時間內(大約15毫秒)初始化時,它們會預設為相同的序列。為了解決這個問題,我們引入一個全域靜態Random
實例,專門用於為各個執行緒產生種子。
上面提到的文章提供了說明性代碼,詳細說明了這兩個考慮因素,並提供了關於C#中Random
的複雜性的深入指導。
以上是C# 的 Random.Next() 是執行緒安全的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!