最近我看到一些C#项目使用双重检查锁定模式Dictionary.像这样的东西:
private static readonly object _lock = new object();
private static volatile IDictionary<string, object> _cache =
new Dictionary<string, object>();
public static object Create(string key)
{
object val;
if (!_cache.TryGetValue(key, out val))
{
lock (_lock)
{
if (!_cache.TryGetValue(key, out val))
{
val = new object(); // factory construction based on key here.
_cache.Add(key, val);
}
}
}
return val;
}
Run Code Online (Sandbox Code Playgroud)
这段代码是不正确的,因为当(在锁外)迭代Dictionary集合时,可以"增长" 集合.在许多情况下这可能是极不可能的,但仍然是错误的._cache.Add()_cache.TryGetValue
是否有一个简单的程序来证明此代码失败了?
将其纳入单元测试是否有意义?如果是这样,怎么样?