在类中读/写C#属性的线程安全方式是什么
本文关键字:线程 安全 方式 是什么 属性 | 更新日期: 2023-09-27 18:21:41
我是C#的新手。在Java中,我可以通过在setter/getter方法中使用"synchronized"关键字来读取/写入Java类成员。
你能告诉我在C#中做同样的事情的正确方法是什么吗?在C#中没有同步关键字。我应该使用C#版本的java';s同步的关键字??
或者使用Monitor.Enter(然后是Monitor.Exit)?
在private object _lock = new object()
字段中使用Monitor.Enter
/Exit
(或lock
-Monitor
的语法糖)。
不要使用MethodImplOptions.Synchronized
。它锁定在this
上,因此可能会有其他代码锁定在同一实例上,从而导致死锁。
不建议对公共类型锁定实例或类型(如Synchronized标志),因为您自己的代码以外的代码可以对公共类型和实例进行锁定。这可能会导致死锁或其他同步问题。
在某些情况下,volatile
可能就足够了(尽管这取决于您要防范的内容和数据类型):
private volatile int _counter;
public int Counter
{
get { return _counter; }
set { _counter = value; }
}
OR 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;
}
}
}
}