我们说我有以下方法,在完成某些工作后称为回调。
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 执行的任何操作(如上所述)?还是完全没必要?
答案 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)
完全没必要,因为线程之间不能共享局部变量。所以永远不要有疑虑