C# 中的 volatile 關鍵字
volatile 關鍵字表示字段可能被多個并發執行線程修改。聲明為 volatile 的字段不受編譯器優化(假定由單個線程訪問)的限制。這樣可以確保該字段在任何時間呈現的都是最新的值。
volatile 修飾符通常用于由多個線程訪問而不使用 lock 語句(C# 參考) 語句對訪問進行序列化的字段。有關在多線程方案中使用 volatile 的示例,請參見如何:創建和終止線程(C# 編程指南)。
volatile 關鍵字可應用于以下類型的字段:
- 引用類型。
- 指針類型(在不安全的上下文中)。請注意,雖然指針本身可以是可變的,但是它指向的對象不能是可變的。換句話說,您無法聲明“指向可變對象的指針”。
- 整型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。
- 具有整數基類型的枚舉類型。
- 已知為引用類型的泛型類型參數。
- IntPtr 和 UIntPtr。
可變關鍵字僅可應用于類或結構字段。不能將局部變量聲明為 volatile。
通過將 volatile 與 _shouldStop 數據成員一起使用,可以從多個線程安全地訪問此成員,而不需要使用正式的線程同步技術,但這僅僅是因為 _shouldStop 是 bool。這意味著只需要執行單個原子操作就能修改 _shouldStop。但是,如果此數據成員是類、結構或數組,那么,從多個線程訪問它可能會導致間歇的數據損壞。假設有一個更改數組中的值的線程。Windows 定期中斷線程,以便允許其他線程執行,因此線程會在分配某些數組元素之后和分配其他元素之前被中斷。這意味著,數組現在有了一個程序員從不想要的狀態,因此,讀取此數組的另一個線程可能會失敗。
張志敏所有文章遵循創作共用版權協議,要求署名、非商業 、保持一致。在滿足創作共用版權協議的基礎上可以轉載,但請以超鏈接形式注明出處。
本博客已經遷移到 GitHub , 圍觀地址: https://beginor.github.io/
浙公網安備 33010602011771號