У меня есть класс, который поддерживает статический словарь кэшированных результатов поиска с моего контроллера домена - имена пользователей и адреса электронной почты.
Мой код выглядит примерно так. например:
private static Dictionary<string, string> emailCache = new Dictionary<string, string>();
protected string GetUserEmail(string accountName)
{
if (emailCache.ContainsKey(accountName))
{
return(emailCache[accountName]);
}
lock(/* something */)
{
if (emailCache.ContainsKey(accountName))
{
return(emailCache[accountName]);
}
var email = GetEmailFromActiveDirectory(accountName);
emailCache.Add(accountName, email);
return(email);
}
}
Требуется ли блокировка? Я предполагаю это, поскольку несколько запросов могут выполнять поиск одновременно и в конечном итоге пытаться вставить один и тот же ключ в один и тот же статический словарь.
Если блокировка требуется , нужно ли мне создавать выделенный экземпляр статического объекта для использования в качестве токена блокировки, или безопасно ли использовать фактический экземпляр словаря в качестве токена блокировки?