Или необходимо ли всегда создавать некоторый другой объект блокирования?
Да, бросьте его к IDictionary и соединитесь .SyncRoot
:
Generic.Dictionary<int, int> dic = new Generic.Dictionary<int, int>();
lock (((IDictionary)dic).SyncRoot)
{
// code
}
Благодаря этому источнику для получения информации.
Конечно, ориентированный на многопотоковое исполнение словарь был бы хорош также, как другие предположили.
Можно соединить любой объект, которого Вы желаете (кроме типов значения). Это рекомендуется, хотя соединить объект.SyncRoot.