锁定强制变量是否直接写入内存而不是像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)
锁在第一条指令之前引入了一个获取栅栏,在它的最后一条指令之后引入了一个释放栅栏。
获取围栏可以防止锁内的指令及时向后移动,在锁之上(即"缓存")。 (另外,请注意它是如何防止锁上方的指令在锁内移动的。)
这是规范保证的。用于实现此目的的机制(例如,防止处理器使用寄存器和直接写入/读取存储器,缓存失效等)并不相关。