c# – 这个非锁定的TryGetValue()字典是否访问线程安全?

前端之家收集整理的这篇文章主要介绍了c# – 这个非锁定的TryGetValue()字典是否访问线程安全?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. private object lockObj = new object();
  2.  
  3. private Dictionary<int,string> dict = new Dictionary<int,string>();
  4.  
  5. public string GetOrAddFromDict(int key)
  6. {
  7. string value;
  8.  
  9. // non-locked access:
  10. if (dict.TryGetValue(key,out value))
  11. return value;
  12.  
  13. lock (this.lockObj)
  14. {
  15. if (dict.TryGetValue(key,out value))
  16. return value;
  17.  
  18. string newValue = "value of " + key; // place long operation here
  19. dict.Add(key,newValue);
  20.  
  21. return newValue;
  22. }
  23. }

问题a:线程安全吗?如果是,为什么?

问题b:这个双重TryGetValue()模式是怎么调用的?

解决方法

a)这不是线程安全的,因为基础的Dictionary本身不是线程安全的.如果另一个线程同时调用Add,则会发生未定义的行为.

b)这实际上是double-checked locking的尝试.

我建议使用ConcurrentDictionary类,因为它是为这种情况设计的.另一个选择是使用ReaderWriterLockSlim(或ReaderWriterLock),如果您没有定位.NET 4.0.

猜你在找的C#相关文章