阅读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);
}
答案 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类型的一般规则。