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

时间:2015-11-13 02:27:15

标签: c# multithreading

我是C#的新手。在Java中,我可以通过同步'来对Java类成员进行读/写操作。 setter / getter方法中的关键字。

请告诉我在C#中做同样的事情的正确方法是什么?在C#中没有synchronized关键字。我应该使用' [MethodImpl(MethodImplOptions.Synchronized)]注释'在C# version of java's synchronized keyword?中提到了什么?

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

3 个答案:

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