我想實現一個通用的線程安全的高速緩存方法,我不知道我應該如何實現它的鎖。如何通過緩存鍵進行鎖定?
它應該是這個樣子:
//private static readonly lockObject = new Object();
public T GetCache<T>(string key, Func<T> valueFactory...)
{
// try to pull from cache here
lock (lockObject) // I don't want to use static object lock here because then every time a lock is performed, all cached objects in my site have to wait, regarding of the cache key.
{
// cache was empty before we got the lock, check again inside the lock
// cache is still empty, so retreive the value here
// store the value in the cache here
}
// return the cached value here
}
你到底想達到什麼目的?在我看來,你是混淆類型的鎖2之間:鎖保證只有一個線程可以編輯緩存的對象,並鎖定,以確保添加/從緩存中刪除是線程安全的。爲每個對象添加一個鎖定將有助於確保只有一個線程可以更改它,但它與從緩存中添加/刪除它無關(這個實現你沒有提供,但我猜測它會是某種字典)。無論如何,我不認爲你可以解散緩存 - 收集級鎖。 – YavgenyP
我正在使用Asp.net緩存...所以我不必實現自己的字典...而我正在談論鎖定添加...讓我們說1000人同時請求頁面,我想只有他們其中的緩存爲對象,和所有的其他人使用它... – Amir
你仍然需要鎖定底層集合,而不是對象。如果我理解正確,你想要做的是檢查對象是否不存在於此集合中,然後才添加它。如果您使用.net 4,則可以使用其新的阻塞集合之一(例如ConcurrentDictionary)來確保每個鍵只添加一次。 – YavgenyP