private object lockObj = new object();
private Dictionary<int, string> dict = new Dictionary<int, string>();
public string GetOrAddFromDict(int key)
{
string value;
// non-locked access:
if (dict.TryGetValue(key, out value))
return value;
lock (this.lockObj)
{
if (dict.TryGetValue(key, out value))
return value;
string newValue = "value of " + key; // place long operation here
dict.Add(key, newValue);
return newValue;
}
}
Question a: Is it thread-safe? If yes, why?
Question b: How is this double-TryGetValue() pattern called?
a) This is not thread-safe, as the underlying
Dictionaryitself is not thread safe. If another thread is calling Add at the same time, undefined behavior can occur.b) This is effectively an attempt at double-checked locking.
I would recommend using the ConcurrentDictionary class instead, as it’s designed for this scenario. Another option would be to use a ReaderWriterLockSlim (or ReaderWriterLock), if you’re not targetting .NET 4.0.