volatile是最簡單的一種同步方法。volatile 關鍵字表示字段可能被多個并發執行線程修改。聲明為 volatile 的字段不受編譯器優化(假定由單個線程訪問)的限制。這樣可以確保該字段在任何時間呈現的都是最新的值。當然簡單是要付出代價的。它只能在變量一級做同步,volatile的含義就是告訴處理器,不要將我放入工作內存,請直接在主存操作我。因此,當多線程同時訪問該變量時,都將直接操作主存,從本質上做到了變量共享。
volatile 關鍵字可應用于以下類型的字段:
(1)引用類型Any reference type
(2)指針類型(不安全的上下文中)Any pointer type (in an unsafe context)
(3)整型,如sbyte, byte, short, ushort, int, uint, char, float, bool.
(4)具有整數基類型的枚舉類型。 An enum type with an enum base type of byte, sbyte, short, ushort, int, or uint.
(5)已知為引用類型的泛型類型參數:IntPtr 和 UIntPtr。
可變關鍵字僅可應用于類或結構字段。不能將局部變量聲明為 volatile。
下面介紹一個具體的例子來說明一下:
public class A
{
private volatile int _i;
public int I
{
get { return _i; }
set { _i = value; }
}
}
但volatile并不能實現真正的同步,因為它的操作級別只停留在變量級別,而不是原子級別。如果是在單處理器系統中,是沒有任何問題的,變量在主存中沒有機會被其他人修改,因為只有一個處理器,這就叫作processor Self-Consistency。但在多處理器系統中,可能就會有問題。每個處理器都有自己的data cach,而且被更新的數據也不一定會立即寫回到主存。所以可能會造成不同步,但這種情況很難發生,因為cach的讀寫速度相當快,flush的頻率也相當高,只有在壓力測試的時候才有可能發生,而且幾率非常非常小。
新聞熱點
疑難解答