C# 使用锁和volatile的缓存变量

C# 使用锁和volatile的缓存变量,c#,locking,volatile,C#,Locking,Volatile,锁是否强制变量直接写入内存,而不是像volatile那样缓存?在Orion Edwards中指出,使用锁比使用volatile要好,但是如果从锁中访问公共变量,并且总是从该锁访问,这是否意味着它永远不会缓存在此lock语句之外 private readonly object locker = new object(); private bool? _Var = null; public bool? Var { get { lock (locker)

锁是否强制变量直接写入内存,而不是像volatile那样缓存?在Orion Edwards中指出,使用锁比使用volatile要好,但是如果从锁中访问公共变量,并且总是从该锁访问,这是否意味着它永远不会缓存在此lock语句之外

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
        }
    }
}

锁在其第一条指令之前引入获取围栏,在其最后一条指令之后引入释放围栏

acquire围栏防止锁内的指令在时间上向后移动并在锁上方移动(即“缓存”)。(另外,请注意,它不会阻止锁上方的指令在锁内移动)


这是规范所保证的。用于实现这一点的机制(例如,防止处理器使用寄存器和直接写入/读取内存、缓存失效等)不相关。

好的,如果我是正确的,锁会保护代码中描述的_Var变量吗?在本例中使用锁是否安全?