C# Net线程安全中的静态字典

C# Net线程安全中的静态字典,c#,dictionary,thread-safety,C#,Dictionary,Thread Safety,在阅读字典时,它说:“这种类型的公共静态(在Visual Basic中共享)成员是线程安全的。任何实例成员都不能保证是线程安全的。” 这意味着使用这样的词典: static object syncObject = new object(); static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>(); 它指的是类本身上的静态方法。该语句实际上是添加到大多数类中的

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

这意味着使用这样的词典:


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

它指的是类本身上的静态方法。该语句实际上是添加到大多数类中的样板文档。Dictionary类实际上并不公开任何静态方法


您必须自己使用lock关键字或者甚至是ReaderWriterLock来序列化对字典类的访问。线程是一个非常复杂的主题,lock关键字并不总是合适的。Joe Duffy的一本好书深入探讨了保护共享应用程序资源的问题。

这意味着,如果调用Add方法(实例方法),最好使用自己的锁定或序列化语义确保以独占方式访问字典。如果两个线程同时修改字典的状态,可能会发生不好的事情,您有责任确保不会发生这种情况。Dictionary的Add方法中没有任何东西可以为您执行此锁定

然而,如果您在Dictionary上调用某个静态方法(其中没有任何有用的方法),那么没有锁就可以了

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

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


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