【发布时间】:2013-08-16 20:46:16
【问题描述】:
拿下面的代码,多线程环境下会发生什么:
static Dictionary<string,string> _events = new Dictionary<string,string>();
public static Dictionary<string,string> Events { get { return _events;} }
public static void ResetDictionary()
{
_events = new Dictionary<string,string>();
}
在多线程环境中,不同线程可以同时访问此方法和属性。
将新对象分配给可在不同线程中访问的静态变量是否线程安全?会出现什么问题?
是否有时间事件可以为空?如果 2 个线程同时调用 Events 和 ResetDictionary()。
【问题讨论】:
-
如果两个线程同时调用
Events和ResetDictionary,那么可能会发生:线程1 对Events和Events执行某些操作,最终成为一个空字典,或线程 2 首先调用ResetDictionary,然后线程 2 对其进行处理。Events不会最终成为null,除非它被专门设置为null另一个线程;当一个线程在另一个线程调用ResetDictionary之前检查Events != null时,这可能会导致空指针异常。 -
在您期望变量值不会改变的地方使用静态变量(每个请求都类似),或者即使改变它也不会影响您的应用程序(但它会影响。),您的应用程序有可能会在错误的逻辑上运行,它甚至不会引发任何异常,考虑用户更改任何值,然后每个其他传入请求都处理错误的数据,直到该值被其他逻辑重置。所以要明智地使用静态变量。
标签: c# thread-safety