.Net中的静态字典线程安全

时间:2009-04-29 20:21:54

标签: c# dictionary thread-safety

阅读msdn documentation 字典,它说:“这种类型的公共静态(在Visual Basic中共享)成员是线程安全的。任何实例成员都不能保证是线程安全的。”

这意味着用这样的词典:


static object syncObject = new object();
static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>();

做下面的代码是不必要的吗?


lock (syncObject)
{
   context = new TDataContext();
   mydictionary.Add("key", myObject);
}

3 个答案:

答案 0 :(得分:7)

它指的是类本身的静态方法。该语句实际上是添加到大多数类的样板文档。字典&lt;&gt; class实际上并没有公开任何静态方法。

您必须使用lock关键字或者甚至是ReaderWriterLock自行序列化对您的字典类的访问。虽然线程是一个非常复杂的主题,但lock关键字并不总是合适的。 Joe Duffy撰写了一本很棒的书“Concurrent Programming on Windows”,深入探讨了如何保护共享应用程序资源。

答案 1 :(得分:2)

您误解了“此类型的公共静态成员”为“此类型的公共静态实例”。

答案 2 :(得分:1)

这意味着如果调用Add方法(实例方法),则最好通过使用自己的锁定或序列化语义来确保您具有对Dictionary的独占访问权。如果两个线程同时修改您的Dictionary的状态,则可能发生错误,并且您有责任确保不会发生这种情况。 Dictionary的Add方法中没有任何内容可以为您执行此锁定。

但是,如果你在Dictionary上调用了一些静态方法(其中没有任何有用的方法),那么没有锁就可以了。

这是BCL中所有.NET类型的一般规则。