2014-06-19 35 views
1

鎖定力量變量是否直接寫入內存而不是像volatile那樣緩存嗎?在this question Orion Edwards指出使用鎖比使用volatile更好,但是如果從鎖內訪問公共變量並始終從該鎖訪問,這是否意味着它永遠不會被緩存在此鎖語句之外?使用鎖定和易失性緩存變量

private readonly object locker = new object(); 
private bool? _Var = null; 

public bool? Var 
{ 
    get 
    { 
     lock (locker) 
     { 
      //possibly get the variable _Var in cache memory somewhere 
      return this._Var; 
      //force _Var back to memory 
     } 
    } 
    set 
    { 
     lock (locker) 
     { 
      //possibly get the variable _Var in cache memory somewhere 
      this._Var = value; 
      //force _Var back to memory 
     } 
    } 
} 

回答

0

鎖在其第一條指令之前引入了獲取柵欄,並在其最後一條指令之後引入了釋放柵欄。

獲取圍欄防止鎖內的指令被及時向後移動,並且超過鎖(即,「緩存」)。 (另外,注意它如何防止鎖之上的指令在鎖內移動)。

這是規範保證的。用於實現這一點的機制(例如,防止處理器使用寄存器並直接向/從存儲器寫入/讀取,緩存失效等)是不相關的。

+0

好吧,如果我是正確的鎖確實保護_Var變量,如我在代碼中所述?在這個例子中使用鎖是安全的? – Jeffnl

+0

@Jeff是的,它是安全的,因爲在讀取時不會被緩存。 – dcastro