In the following code:
public class StringCache { private readonly object lockobj = new object(); private readonly Dictionary<int, string> cache = new Dictionary<int, string>(); public string GetMemberInfo(int key) { if (cache.ContainsKey(key)) return cache[key]; lock (lockobj) { if (!cache.ContainsKey(key)) cache[key] = GetString(key); } return cache[key]; } private static string GetString(int key) { return 'Not Important'; } }
1) Is ContainsKey thread safe? IOW, what happens if that method is executing when another thread is adding something to the dictionary? 2) For the first return cache[key], is there any chance that it could return a garbled value?
TIA,
MB
The inherent thread safety of ContainsKey doesn’t matter, since there is no synchronization between ContainsKey & cache[key].
For example:
MSDN is pretty clear on this point:
For more info, JaredPar posted a great blog entry at http://blogs.msdn.com/jaredpar/archive/2009/02/11/why-are-thread-safe-collections-so-hard.aspx on thread-safe collections.