这个非锁定的TryGetValue()字典是否可以访问线程安全?
private object lockObj = new object(); private Dictionary dict = new Dictionary(); 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)这实际上是双重检查锁定的尝试。
我建议使用ConcurrentDictionary类,因为它是为这个场景设计的。 另一种选择是使用ReaderWriterLockSlim (或ReaderWriterLock ),如果你不是针对.NET 4.0。
问题a:它是否是线程安全的? 如果是,为什么?
它不仅不是线程安全的; 如果在另一个线程正在重新组织散列桶时访问它,它也会抛出NullReferenceException。 锁定语句是快速的,不要避免它。
问题b:这个双TryGetValue()模式是如何调用的?
它被大多数人称为“虫子”;)
可悲的是没有。
我随身携带一个具有此属性的自定义HashMap。
缺陷在rehash()函数中。