使用lock和volatile缓存变量

本文关键字:缓存 变量 volatile lock 使用 | 更新日期: 2023-09-27 18:09:26

锁是否强制变量直接写入内存,而不是像volatile那样beëing缓存?在这个问题中,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
        }
    }
}

使用lock和volatile缓存变量

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

acquire-fence防止锁内的指令在时间上向后移动并且高于锁(即"缓存")。(另外,注意它并没有阻止锁上面的指令被移动到锁里面)。

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