我的小组目前正在讨论此问题。

有问题的代码与

if (!myDictionary.ContainsKey(key))
{
    lock (_SyncObject)
    {
        if (!myDictionary.ContainsKey(key))
        {
            myDictionary.Add(key,value);
        }
    }
}

我见过的一些帖子说(使用TryGetValue时)可能很大。但是我们团队的成员说这没问题,因为“ContainsKey”不会迭代 key 集合,而是通过O(1)中的哈希码检查 key 是否包含在其中。因此他们声称这里没有危险。

我希望得到您对此问题的诚​​实意见。

最佳答案

不要这样不安全

您可能从一个线程调用ContainsKey,而另一个线程调用AddDictionary<TKey, TValue>根本不支持该功能。如果Add需要重新分配存储桶等,我可以想象您会得到一些非常奇怪的结果,或者是一个异常。它的编写方式可能使您看不到任何讨厌的效果,但我不想依靠它。

使用双重检查锁定来对字段进行简单的读/写是一回事,尽管我仍会反对它-进行已明确描述为多次并行调用并不安全的API调用是另一回事。

如果您使用的是.NET 4,则 ConcurrentDictionary 可能是前进的方向。否则,只需锁定每个访问权限。

10-08 20:12