Я бы хотел использовать .NET
класс Lazy
для реализации поточно-безопасного кэширования. Предположим, у нас была следующая настройка:
class Foo
{
Lazy<string> cachedAttribute;
Foo()
{
invalidateCache();
}
string initCache()
{
string returnVal = "";
//CALCULATE RETURNVAL HERE
return returnVal;
}
public String CachedAttr
{
get
{
return cachedAttribute.Value;
}
}
void invalidateCache()
{
cachedAttribute = new Lazy<string>(initCache, true);
}
}
Мои вопросы:
Мне кажется, что у меня отсутствует блокировка где-то рядом с invalidateCache , но хоть убей, я не могу понять, что это.
Я уверен, что где-то проблема, я просто не понял, где.
[EDIT]
Хорошо, похоже, я был прав, были вещи, о которых я не думал. Если поток увидит устаревший кеш, это будет очень плохо, поэтому похоже, что «Ленивый» недостаточно безопасен. Однако к Property часто обращаются, поэтому я занимался предварительной оптимизацией в надежде, что смогу чему-то научиться и иметь шаблон для использования в будущем для поточно-безопасного кэширования. Я продолжу работать над этим.
PS: Я решил сделать объект поточно небезопасным и вместо этого тщательно контролировать доступ к объекту.