使用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
}
}
}
锁在发出第一条指令之前引入了一个获取栅栏,在发出最后一条指令之后引入了一个释放栅栏。
acquire-fence防止锁内的指令在时间上向后移动并且高于锁(即"缓存")。(另外,注意它并没有阻止锁上面的指令被移动到锁里面)。
这是规范所保证的。实现这一点的机制(例如,防止处理器使用寄存器和直接从内存写入/读取,缓存无效等)是不相关的。