Я хотел бы использовать шаблон if-lock-if для проверки наличия объекта в словаре в многопоточной среде. Таким образом, код я рассматриваю как выглядит так:Доступ к .NET-словарю в многопоточной среде
private IDictionary<string, SomeType> m_dic = new Dictionary<string, SomeType>();
private SomeType GetSomeObject(string key)
{
SomeType obj;
if (!m_dic.TryGetValue(key, out obj))
{
lock(m_dic)
{
if (!m_dic.TryGetValue(key, out obj))
{
m_dic[key] = obj = CreateSomeObject(key);
}
}
}
return obj;
}
Я действую исходя из предположения, что даже если другой поток вставки объекта в том же ключе прямо сейчас, TryGetValue не будет возвращать частично набор ссылок (например, вещь не существует в .NET, не так ли?), скорее она вернет null, и поэтому мы войдем в защищенный раздел и повторим проверку.
Мой вопрос является моим предположением правильно, и код является правильным?
Спасибо.
EDIT
Позвольте мне бросить в ограничение. Словарь фактически является словарем одиночных объектов. Итак, как только запись занята, она никогда не изменяется. Точно так же, как свойство экземпляра синглтона - после его установки оно никогда не изменяется. Учитывая это ограничение, можно ли использовать шаблон if-lock-if?
Редактирование: Нет, внутренние буферы Словаря по-прежнему не являются потокобезопасными. –