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