相关疑难解决方法(0)

如何显示带有Dictionary的TryGetValue的双重检查锁模式不是线程安全的

最近我看到一些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

是否有一个简单的程序来证明此代码失败了?

将其纳入单元测试是否有意义?如果是这样,怎么样?

.net c# multithreading double-checked-locking

13
推荐指数
3
解决办法
3612
查看次数

标签 统计

.net ×1

c# ×1

double-checked-locking ×1

multithreading ×1