У меня есть функция, которая возвращает запись на словаре, на основе Ключа (имя) и если это не существует, возвращает недавно созданный.
Вопрос, который я имею, с "двойным замком": 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;
}
Это гарантированно сработает - блокировки в .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);
}
Нет проблем, блокировка повторно используется тем же потоком. Не все объекты синхронизации имеют сходство потоков, например, семафор. Но Mutex и Monitor (блокировка) в порядке.