我想用.NET
的Lazy<T>
類來實現線程安全緩存。假設我們有以下設置:可以(應該?)懶惰<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附近的地方,但對於我的生活我無法弄清楚它是什麼。
我確定這個地方有問題,我只是沒有弄清楚在哪裏。
[編輯]
好吧,但是它看起來像我是對的,有些事情我還沒有想過。如果一個線程看到過時的緩存會是一件非常糟糕的事情,所以看起來像「懶惰」不夠安全。該屬性雖然被訪問了很多,但是我正在進行預先優化,希望能夠學習一些東西,並且有一個模式可以在將來用於線程安全緩存。我會繼續努力的。
P.S .:我決定讓對象線程不安全並且可以小心控制對象的訪問權限。
是的,無效值在這種情況下不好(至少不是任意長的值)。謝謝。 – Crisfole 2010-12-03 18:10:27