什么是在类中读/写C#属性的线程安全方法?
我是C#的新手。 在Java中,我可以通过在setter / getter方法中使用’synchronized’关键字来读/写Java类成员。
你能告诉我在C#中做同样的事情的正确方法吗? 在C#中没有synchronized关键字。 我应该使用在java的synchronized关键字的C#版本中提到的'[MethodImpl(MethodImplOptions.Synchronized)]注释吗? ?
或者使用Monitor.Enter(以及随后的Monitor.Exit)?
使用Monitor.Enter
/ Exit
(或lock
– Monitor
的语法糖)和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; } } } }