阅读 msdn文档中的词典,它说:<!> “;此类型的公共静态(在Visual Basic中为Shared)成员是线程安全的。不保证任何实例成员都是线程安全的。<!> quot;

这意味着用这样的词典:


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

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


lock (syncObject)
{
   context = new TDataContext();
   mydictionary.Add("key", myObject);
}
有帮助吗?

解决方案

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

您必须使用lock关键字或者甚至是ReaderWriterLock自行序列化对您的字典类的访问。虽然线程是一个非常复杂的主题,但lock关键字并不总是合适的。 Joe Duffy有一本很好的书<!>“ Windows上的并发编程 < !> QUOT;这有助于保护共享应用程序资源。

其他提示

您误解了<!>这种类型的公共静态成员 <!> as <!>“此类型的公共静态实例 <!>”;

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top