相关疑难解决方法(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
查看次数

字典查找需要锁定吗?

lock(dictionaryX)
{
   dictionaryX.TryGetValue(key, out value);
}
Run Code Online (Sandbox Code Playgroud)

在查找字典时是否需要锁定?

程序是多线程的,并且在向dict添加键/值时.dict被锁定了.

c# lookup multithreading dictionary locking

12
推荐指数
2
解决办法
8483
查看次数