使用lock和volatile缓存变量

时间:2014-06-19 10:47:49

标签: c# locking volatile

锁定强制变量是否直接写入内存而不是像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
        }
    }
}

1 个答案:

答案 0 :(得分:0)

锁在第一条指令之前引入了一个获取栅栏,在它的最后一条指令之后引入了一个释放栅栏。

获取围栏可以防止锁内的指令及时向后移动,锁之上(即"缓存")。 (另外,请注意它是如何防止锁上方的指令在锁内移动的。)

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