Hashtables具有syncroot属性,但通用词典不具备。如果我有代码执行此操作:
lock (hashtable.Syncroot)
{
....
}
如果我删除哈希表并更改为通用词典,我该如何复制?
答案 0 :(得分:12)
如果你严格要求兼容性,那么布莱恩是正确的。这是在Dictionary上维护当前语义的最佳方法。
虽然扩展了它。 SyncRoot属性未直接添加到通用字典的原因是它是一种执行同步的危险方式。它只比“锁定(这个)”更好,这是非常危险的并且容易出现死锁。以下是一些链接,说明为什么这很糟糕。
答案 1 :(得分:7)
SyncRoot背后的新思路是原始设计中的错误。如果要锁定的唯一内容是字典并且它是私有的,则可以将其锁定或用作同步对象的其他对象。当你保护的状态不仅仅是字典时,后一种技术很有用。
// used as you would have used SyncRoot before
object _syncLock = new object();
Dictionary<string, int> numberMapper = new Dictionary<string, int>();
// in some method...
lock (_syncLock)
{
// use the dictionary here.
}
答案 2 :(得分:5)
var dictionary = new Dictionary<int, string>();
lock(((ICollection) dictionary).SyncRoot)
{
// ...
}
答案 3 :(得分:3)
如果哈希表/字典不是公共的,您可以直接锁定字典对象。