我是否需要针对方法范围

时间:2017-02-18 13:52:47

标签: c# multithreading synchronization locking monitor

我们说我有以下方法,在完成某些工作后称为回调。

public class MyClass
    {
        private static object _synblock = new object();

    public void MyCallBackMethod()
    {
        Dictionary<int, int> myDict = new Dictionary<int, int>();

        lock(_synblock)
        {
            myDict.Add(1, 1);
        }

    }
}

此方法可以由多个线程调用。在这种情况下,我是否需要同步对此方法范围中定义的局部变量 myDict 执行的任何操作(如上所述)?还是完全没必要?

3 个答案:

答案 0 :(得分:2)

完全没必要。每次调用MyCallbackMethod时,都会实例化一个新的myDict对象。如果多个线程同时使用相同的实例,则只需要保护对Dictionary<,>的访问

答案 1 :(得分:1)

一般规则不是保护实例级成员(和数据)不受多线程环境中的并发访问。基本原理很简单:多线程是一个单独的问题。

我的建议是创建一个只知道如何同步访问的多线程包装器。这反过来要求有一个基类或接口,可以公开你的类的功能。

public interface ISomeInterface
{
    void MyCallBackMethod();
}

public class MyClass : ISomeInterface
{
    private int Data { get; set; }
    public void MyCallBackMethod()
    {
        Dictionary<int, int> myDict = new Dictionary<int, int>();
        myDict.Add(1, 1);
        // access this.Data - this is the part that would
        // make problems in case of multithreaded access
    }
}

public class ThreadSafe : ISomeInterface
{
    private ISomeInterface Contained { get; }
    private object SyncRoot { get; } = new object();

    public ThreadSafe(ISomeInterface contained)
    {
        this.Contained = contained;
    }

    public void MyCallBackMethod()
    {
        lock (this.SyncRoot)
        {
            this.Contained.MyCallBackMethod();
        }
    }
}

答案 2 :(得分:0)

完全没必要,因为线程之间不能共享局部变量。所以永远不要有疑虑