zoukankan      html  css  js  c++  java
  • LRUCache.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;

    namespace Shawnlee.Common.Cache
    {
    public class LRUCache<TKey,TValue>
    {
    const int DEFAULT_CAPACITY = 255;

    int _capacity;
    ReaderWriterLockSlim _locker;
    IDictionary<TKey, TValue> _dictionary;
    LinkedList<TKey> _linkedList;

    public LRUCache() : this(DEFAULT_CAPACITY) { }

    public LRUCache(int capacity)
    {
    _locker = new ReaderWriterLockSlim();
    _capacity = capacity > 0 ? capacity : DEFAULT_CAPACITY;
    _dictionary = new Dictionary<TKey, TValue>();
    _linkedList = new LinkedList<TKey>();
    }

    public void Set(TKey key, TValue value)
    {
    _locker.EnterWriteLock();
    try
    {
    _dictionary[key] = value;
    _linkedList.Remove(key);
    _linkedList.AddFirst(key);
    if (_linkedList.Count > _capacity)
    {
    _dictionary.Remove(_linkedList.Last.Value);
    _linkedList.RemoveLast();
    }
    }
    finally { _locker.ExitWriteLock(); }
    }

    public bool TryGet(TKey key, out TValue value)
    {
    _locker.EnterUpgradeableReadLock();
    try
    {
    bool b = _dictionary.TryGetValue(key, out value);
    if (b)
    {
    _locker.EnterWriteLock();
    try
    {
    _linkedList.Remove(key);
    _linkedList.AddFirst(key);
    }
    finally { _locker.ExitWriteLock(); }
    }
    return b;
    }
    catch { throw; }
    finally { _locker.ExitUpgradeableReadLock(); }
    }

    public bool ContainsKey(TKey key)
    {
    _locker.EnterReadLock();
    try
    {
    return _dictionary.ContainsKey(key);
    }
    finally { _locker.ExitReadLock(); }
    }

    public int Count
    {
    get
    {
    _locker.EnterReadLock();
    try
    {
    return _dictionary.Count;
    }
    finally { _locker.ExitReadLock(); }
    }
    }

    public int Capacity
    {
    get
    {
    _locker.EnterReadLock();
    try
    {
    return _capacity;
    }
    finally { _locker.ExitReadLock(); }
    }
    set
    {
    _locker.EnterUpgradeableReadLock();
    try
    {
    if (value > 0 && _capacity != value)
    {
    _locker.EnterWriteLock();
    try
    {
    _capacity = value;
    while (_linkedList.Count > _capacity)
    {
    _linkedList.RemoveLast();
    }
    }
    finally { _locker.ExitWriteLock(); }
    }
    }
    finally { _locker.ExitUpgradeableReadLock(); }
    }
    }

    public ICollection<TKey> Keys
    {
    get
    {
    _locker.EnterReadLock();
    try
    {
    return _dictionary.Keys;
    }
    finally { _locker.ExitReadLock(); }
    }
    }

    public ICollection<TValue> Values
    {
    get
    {
    _locker.EnterReadLock();
    try
    {
    return _dictionary.Values;
    }
    finally { _locker.ExitReadLock(); }
    }
    }
    }
    }

  • 相关阅读:
    从请假日期列表中取得请假起止日期
    存储过程编写经验和优化措施
    安装IE8不能调试VS2003的解决办法
    javascript驗證若干DropDownList是否有選择
    欢迎光临C/S框架网 www.csframework.com
    C#开发框架钢铁贸易进销存系统演示视频
    基于.Net C/S结构系统开发框架V2.2正式发布!
    C#.NET Winform+WebService开发框架完整版本
    C#.Net C/S快速开发框架V2.2版本介绍
    专注C# .Net C/S结构系统开发框架,C/S框架网
  • 原文地址:https://www.cnblogs.com/mylife_001/p/6000968.html
Copyright © 2011-2022 走看看