Я бы хотел использовать класс .NET
Lazy<T>
для реализации потокового кэширования.Предположим, у нас была следующая настройка:
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, но я не могу понять, что это такое.
Я уверен, что естьпроблема с этим где-то, я просто не выяснил, где.
[РЕДАКТИРОВАТЬ]
Хорошо, похоже, я был прав, были вещи, которые у меня не былоне думал о.Если поток видит устаревший кеш, это будет очень плохо, поэтому похоже, что «Lazy» недостаточно безопасен.Однако к этому свойству обращаются очень часто, поэтому я занимался оптимизацией до наступления зрелости в надежде на то, что смогу чему-то научиться и иметь шаблон, который можно использовать в будущем для поточно-ориентированного кэширования.Я продолжу над этим работать.
PS: Я решил сделать объект небезопасным, и вместо этого иметь доступ к объекту, который будет тщательно контролироваться.