У меня есть собственная реализация Cache, которая позволяет кэшировать TCacheable<TKey>
потомков, используя алгоритм замены кэша LRU (Least Недавно Использованный).
Каждый раз, когда к элементу обращаются, он попадает в верхнюю часть очереди LRU, используя следующую синхронизированную функцию:
// a single instance is created to handle all TCacheable<T> elements
public class Cache()
{
private TCacheable<T> oldest, newest;
private object syncQueue = new object();
private void topQueue(TCacheable<T> el)
{
lock (syncQueue)
if (newest != el)
{
if (el.elder != null) el.elder.newer = el.newer;
if (el.newer != null) el.newer.elder = el.elder;
if (oldest == el) oldest = el.newer;
if (oldest == null) oldest = el;
if (newest != null) newest.newer = el;
el.newer = null;
el.elder = newest;
newest = el;
}
}
}
Узким местом в этой функции является оператор lock()
, который ограничивает доступ к кешу только одним потоком за раз.
Вопрос : Можно ли избавиться от lock(syncQueue)
в этой функции при сохранении целостности очереди?