最近我看到一些 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;
}
此代码不正确,因为Dictionary
可以在(在锁之外)迭代集合时“增长”_cache.Add()
集合_cache.TryGetValue
。在许多情况下,这可能是极不可能的,但仍然是错误的。
是否有一个简单的程序来证明此代码失败?
将其合并到单元测试中是否有意义?如果是这样,怎么办?