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;
}
}