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

本文关键字:线程 安全 方式 是什么 属性 | 更新日期: 2023-09-27 18:21:41

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

你能告诉我在C#中做同样的事情的正确方法是什么吗?在C#中没有同步关键字。我应该使用C#版本的java';s同步的关键字??

或者使用Monitor.Enter(然后是Monitor.Exit)?

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

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;
            }
        }
    }
}