我是C#的新手。在Java中,我可以通过同步'来对Java类成员进行读/写操作。 setter / getter方法中的关键字。
请告诉我在C#中做同样的事情的正确方法是什么?在C#中没有synchronized关键字。我应该使用' [MethodImpl(MethodImplOptions.Synchronized)]注释'在C# version of java's synchronized keyword?中提到了什么?
或者使用Monitor.Enter(以及随后的Monitor.Exit)?
答案 0 :(得分:4)
在某些情况下,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
答案 1 :(得分:3)
使用Monitor.Enter
/ Exit
(或lock
- Monitor
的语法糖与private object _lock = new object()
字段。
请勿使用MethodImplOptions.Synchronized
。它锁定this
,因此其他一些代码可能会锁定同一个实例导致死锁。
不建议对公共类型锁定实例或类型(与Synchronized标志一样),因为除了您自己的代码之外的代码可以锁定公共类型和实例。这可能会导致死锁或其他同步问题。
答案 2 :(得分:2)
正如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;
}
}
}
}