Нет, это не будет потокобезопасным.
Блокировка будет блокироваться только при получении ссылки на ваш внутренний (dict) экземпляр словаря. Он не блокируется, когда пользователь пытается добавить в словарь или прочитать из словаря.
Если вам нужно обеспечить безопасный для потоков доступ, я бы порекомендовал сохранить частный словарь и создать свои собственные методы для получения / установки / добавления значений в / из словаря. Таким образом, вы можете установить замки на место, чтобы обеспечить необходимую степень детализации.
Это будет выглядеть примерно так:
public bool TryGetValue(key thekey, out SomeRef result)
{
lock(myLock) { return this.dict.TryGetValue(thekey, out result); }
}
public void Add(key thekey, SomeRef value)
{
lock(myLock) { this.dict.Add(thekey, value) }
}
// etc for each method you need to implement...
Идея в том, что ваши клиенты используют ваш класс напрямую, а ваш класс обрабатывает синхронизацию. Если вы ожидаете, что они будут перебирать значения (например, оператор foreach), вы можете решить, следует ли скопировать значения в список и вернуть его или предоставить перечислитель напрямую (IEnumerator<SomeRef> GetValues()
) и т. Д.