我可以在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);
}
}
答案 0 :(得分:2)
答案是“是”,但它对您没有帮助,因为一旦TryGetValue存在并且您有机会阅读结果之前,该值可能会发生变化。
如果另一个线程尝试添加,则不会发生任何不良情况。该线程可能在TryGetValue完成时阻塞,或者它可能同时完成 - 它取决于ConcurrentDictionary的实现细节,ConcurrencyLevel和相关密钥的哈希码。