Я видел много примеров кеширования, которые включают блокировку. Я пытаюсь кэшировать общий список для всего приложения. Мне действительно нужно использовать блокировки, как показано ниже? Самое худшее может случиться, если я не использую блокировку;Нужно ли нам блокировать при кешировании в приложении asp.net mvc?
Если несколько потоков обнаружения промаха кэша в примерно такой же time.They может попытаться загрузить данные simultaneously.In вывод, данные будут такими же ...
Это правда?
public class Worker
{
private static object someLock;
public static object CacheMethod()
{
var results = HttpContext.Current.Cache["Common"];
if (results == null)
{
lock (someLock)
{
results = HttpContext.Current.Cache["Common"];
if (results == null)
{
results = GetResultsFromSomewhere();
HttpContext.Current.Cache.Insert("Common", results, null,
DateTime.Now.AddHours(1), Cache.NoSlidingExpiration);
}
}
}
return results;
}``
Если я не использую блокировку, сценарий будет таким; Если пользовательский запрос видит этот кеш null, он будет вызывать GetResultsFromSomewhere, который занимает 10 секунд. В то же время пользователь B делает то же самое и ждет 10 секунд. Но я использую блокировку, сценарий будет таким; Пользователь A захватывает блокировку, и пользователь B будет ждать, когда этот замок будет выпущен. Он будет примерно ждать 10 секунд снова. Так что мне кажется, что не будет такой потери производительности. Я не прав? – erhan355
«В то же время пользователь B делает то же самое и ждет 10 секунд» Нет, пользователь B также вызывает GetResultsFromSomewhere. Теперь у нас есть два таких вызова и в два раза больше использования ресурсов. Как вы думаете, почему пользователь B будет ждать? – usr
Я попытался сказать, что пользователь B вызовет GetResultsFromSomewhere и дождитесь, пока операция вернет результат, и он снова займет 10 секунд. Если я использую блокировку, чем это время, пользователь B ждет, когда пользователь A выйдет из замка, и это займет 10 секунд. Как-то, пользователь B ждет примерно 10 секунд. На мой взгляд, разница между кешированием с блокировкой и без блокировки невелика. Есть ли там? – erhan355