Статические методы обновления Dictionary в ASP.NET - безопасно ли lock () в самом словаре?

У меня есть класс, который поддерживает статический словарь кэшированных результатов поиска с моего контроллера домена - имена пользователей и адреса электронной почты.

Мой код выглядит примерно так. например:

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);
    }
}

Требуется ли блокировка? Я предполагаю это, поскольку несколько запросов могут выполнять поиск одновременно и в конечном итоге пытаться вставить один и тот же ключ в один и тот же статический словарь.

Если блокировка требуется , нужно ли мне создавать выделенный экземпляр статического объекта для использования в качестве токена блокировки, или безопасно ли использовать фактический экземпляр словаря в качестве токена блокировки?

5
задан Arseni Mourzenko 23 December 2010 в 13:24
поделиться