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