在这种情况下需要锁吗?

Tom*_*ier 11 c# multithreading locking

是否有必要保护对多线程应用程序中引用类型的单个变量的访问?我目前锁定这个变量:

private readonly object _lock = new object();
private MyType _value;
public MyType Value
{
  get { lock (_lock) return _value; }
  set { lock (_lock) _value = value; }
}
Run Code Online (Sandbox Code Playgroud)

但我想知道这是否真的有必要?是不是将值赋值给字段原子?如果我不锁定这种情况可以出问题吗?

PS:MyType是一个不可变类:所有字段都在构造函数中设置,不会更改.要更改某些内容,将创建一个新实例并将其分配给上面的变量.

Jon*_*eet 10

原子很少就足够了.

我通常希望获得变量的最新值,而不是潜在地看到变量 - 因此需要某种内存屏障,无论是读写还是写入.锁定是实现这一目标的简单方法,代价是由于争用可能会丢失一些性能.

I used to believe that making the variable volatile would be enough in this situation. I'm no longer convinced this is the case. Basically I now try to avoid writing lock-free code when shared data is involved, unless I'm able to use building blocks written by people who really understand these things (e.g. Joe Duffy).


ewe*_*nli 7

这有一个volatile关键字.没有它是否安全取决于场景.但编译器可以做有趣的事情,比如重新组织操作顺序.因此,即使对一个字段进行读/写也可能不安全.

  • C#编译器从不重新排序任何东西; 这是你必须担心的*处理器*. (2认同)