2

阅读字典的msdn 文档时说:“这种类型的公共静态(在 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);
}
4

3 回答 3

7

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

您必须自己使用 lock 关键字甚至 ReaderWriterLock 序列化对字典类的访问。线程虽然是一个非常复杂的主题,并且 lock 关键字并不总是合适的。Joe Duffy 有一本很棒的书“ Windows 上的并发编程”,它深入探讨了保护共享应用程序资源。

于 2009-04-29T20:23:00.923 回答
2

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

于 2009-04-29T20:26:20.540 回答
1

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

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

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

于 2009-04-29T20:25:56.720 回答