- 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;
- }
- }
问题a:线程安全吗?如果是,为什么?
问题b:这个双重TryGetValue()模式是怎么调用的?
解决方法
a)这不是线程安全的,因为基础的Dictionary本身不是线程安全的.如果另一个线程同时调用Add,则会发生未定义的行为.
b)这实际上是double-checked locking的尝试.
我建议使用ConcurrentDictionary类,因为它是为这种情况设计的.另一个选择是使用ReaderWriterLockSlim(或ReaderWriterLock),如果您没有定位.NET 4.0.