什么是在类中读/写C#属性的线程安全方法?

我是C#的新手。 在Java中,我可以通过在setter / getter方法中使用’synchronized’关键字来读/写Java类成员。

你能告诉我在C#中做同样的事情的正确方法吗? 在C#中没有synchronized关键字。 我应该使用在java的synchronized关键字的C#版本中提到的'[MethodImpl(MethodImplOptions.Synchronized)]注释吗? ?

或者使用Monitor.Enter(以及随后的Monitor.Exit)?

使用Monitor.Enter / Exit (或lockMonitor的语法糖)和private object _lock = new object()字段。

不要使用MethodImplOptions.Synchronized 。 它锁定了this ,所以有些其他代码可能会锁定同一个实例导致死锁。

对于公共类型,不建议对实例或类型进行锁定(与Synchronized标志一样),因为除了您自己的代码之外的代码可以对公共类型和实例进行锁定。 这可能会导致死锁或其他同步问题。

在某些情况下, volatile可能就足够了(虽然这取决于你要防范的是什么以及数据类型是什么):

 private volatile int _counter; public int Counter { get { return _counter; } set { _counter = value; } } 

lock

 #region public int Counter { set; get; } private int _counter; private object sync_counter = new object(); public int Counter { set { lock(sync_counter) { _counter = value; } } get { lock(sync_counter) { return _counter; } } } #endregion 

正如Lortz所说,最好的方法是使用锁

 public class ThreadSafeSetters { private bool _foo; private object _locker = new object(); public bool Foo { get { lock (_locker) { return _foo; } } set { lock (_locker) { _foo = value; } } } }