在同一个线程内锁定字典

Mex*_*Dev 10 c# multithreading

我有一个函数,它根据Key(名称)返回字典上的条目,如果它不存在,则返回一个新创建的条目.

我的问题是"双锁":SomeFunction锁定_dictionary,检查键的存在,然后调用一个也锁定相同字典的函数,它似乎工作但我不确定是否有一个这种方法的潜在问题.

public Machine SomeFunction(string name) 
{
    lock (_dictionary)
    {
        if (!_dictionary.ContainsKey(name))
                    return CreateMachine(name);
        return _dictionary[name];
    }
}


private Machine CreateMachine(string name)
{
    MachineSetup ms = new Machine(name);
    lock(_dictionary)
    {
        _ictionary.Add(name, ms);
    }
    return vm;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

这是有效的 - 在.NET中递锁是递归的.它是否真的是一个好主意是另一回事......相反如何:

public Machine SomeFunction(string name) 
{ 
    lock (_dictionary)
    {
        Machine result;
        if (!_dictionary.TryGetValue(name, out result))
        {
            result = CreateMachine(name);
            _dictionary[name] = result;
        }
        return result;
    } 
}

// This is now *just* responsible for creating the machine,
// not for maintaining the dictionary. The dictionary manipulation
// is confined to the above method.
private Machine CreateMachine(string name)
{
    return new Machine(name);
}
Run Code Online (Sandbox Code Playgroud)

  • @Will Marcouiller - 您的方案将允许一个线程修改字典,而另一个线程正在读取它.如果字典类是专门设计允许的,那么沿着这些行的一些方案是可能的(在获取锁之后使用额外的TryGetValue).但是,集合通常不是以这种方式设计的,并且内置的Dictionary类是不应该同时读取和写入的类. (2认同)