基于LinkedHashMap的线程安全化LRU Cache缓存

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @description Thread safe lru cache cache based on LinkedHashMap
 * @date 2020/11/2 11:15
 */
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private static final long serialVersionUID = -4407809689385629881L;

    private int maxCapacity;

    private static final float DEFAULT_LOAD_FACTOR = 0.75f;

    private static final int INITIAL_CAPACITY = 16;

    private final Lock lock = new ReentrantLock();

    public LRUCache(int maxCapacity) {
        this(maxCapacity, INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, true);
    }

    private LRUCache(int maxCapacity, int initialCapacity, float loadFactor, boolean accessOrder) {
        super(initialCapacity, loadFactor, accessOrder);
        this.maxCapacity = maxCapacity;
    }

    @Override
    public V get(Object key) {
        lock.lock();
        try {
            return super.get(key);
        } finally {
            lock.unlock();
        }
    }

    @Override
    public V put(K key, V value) {
        lock.lock();
        try {
            return super.put(key, value);
        } finally {
            lock.unlock();
        }
    }

    @Override
    public V remove(Object key) {
        lock.lock();
        try {
            return super.remove(key);
        } finally {
            lock.unlock();
        }
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > maxCapacity;
    }
}

  

posted @ 2020-11-02 11:32  屠城校尉杜  阅读(903)  评论(0编辑  收藏  举报