Распространенная идиома кэширования - проверять наличие элемента в кэше, извлекать, если присутствует, или создавать, если нет.
Не создает ли это условие, при котором контекст переключается с Thread 1
наThread 2
происходит в месте с комментариями, значение, добавленное в кэш, может быть немедленно перезаписано, когда произойдет переключение контекста обратно на Thread 1
?Недостатком является то, что calculateFooBar()
теперь вызывается дважды для вычисления одного и того же кэшированного элемента.Является ли это просто принятым «незначительным» следствием этой простой реализации кэширования.Критическая секция обычно не используется, потому что это добавит накладные расходы ко всем GetOrCreate
методам?
Редактировать: _cache - это ссылка на общий кэш данных (например, кэш данных ASP.NET).
//not real C#
class FooBarDictionary
{
...
FooBar GetOrCreate(string key)
{
FooBar fooBar;
if (!_cache.TryGetValue(key, out fooBar))
{
fooBar = calculateFooBar(); //context switch occurs here
fooBars.Add(key, fooBar);
}
return fooBar;
}
}