ConcurrentDictionary上的TryGetValue是原子吗?

时间:2015-03-31 03:26:35

标签: c# multithreading locking

我可以在ConcurrentDictionary上调用TryGetValue并安全地假设在操作过程中该值没有改变。另外,当另一个线程在发生此操作时尝试使用相同的键添加时会发生什么?一些伪代码来解释问题。我知道这不是一个理想的例子。但是,当使用密钥k1进行TryAdd时,具有相同密钥k1的TryGetValue会等待TryAdd完成吗?同样,如果密钥k1的TryGetValue正在进行中,那么TryAdd会为同一个密钥k1等待TryGetVaule完成吗?

class Test
{ 
   ConcurrentDictionary<string, Data> cache;

   public void CalculateAndAddToCache(string key)
   {
        Data val; 
        if (cache.TryGetValue(key, out val))
        {
             return;
        }
        val = // some large computation
        cache.TryAdd(key, val); 
   }
}

1 个答案:

答案 0 :(得分:2)

答案是“是”,但它对您没有帮助,因为一旦TryGetValue存在并且您有机会阅读结果之前,该值可能会发生变化。

如果另一个线程尝试添加,则不会发生任何不良情况。该线程可能在TryGetValue完成时阻塞,或者它可能同时完成 - 它取决于ConcurrentDictionary的实现细节,ConcurrencyLevel和相关密钥的哈希码。