Словарь блокировки в том же потоке

У меня есть функция, которая возвращает запись на словаре, на основе Ключа (имя) и если это не существует, возвращает недавно созданный.

Вопрос, который я имею, с "двойным замком": 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;
}
10
задан Konrad Rudolph 9 March 2010 в 19:11
поделиться

2 ответа

Это гарантированно сработает - блокировки в .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);
}
10
ответ дан 3 December 2019 в 23:49
поделиться

Нет проблем, блокировка повторно используется тем же потоком. Не все объекты синхронизации имеют сходство потоков, например, семафор. Но Mutex и Monitor (блокировка) в порядке.

3
ответ дан 3 December 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: