TFdream / blog

个人技术博客,博文写在 Issues 里。
Apache License 2.0
129 stars 18 forks source link

LRU的几种实现方式 #312

Open TFdream opened 4 years ago

TFdream commented 4 years ago

一、 什么是LRU?

LRU 即 Least Rencetly Used(最近最少使用)缓存替换策略。在任何LRU算法中,它必定有以下两个策略组成:

其中,退化的策略,一般按以下两种方式去处理:

实现方式

基于LinkedHashMap

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

public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V>  {  
    private final int maxCapacity;  
    private static final float DEFAULT_LOAD_FACTOR = 0.75f;  
    private final Lock lock = new ReentrantLock();  

    public LRULinkedHashMap(int maxCapacity) {  
        super(maxCapacity, DEFAULT_LOAD_FACTOR, true);  
        this.maxCapacity = maxCapacity;  
    }  

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

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

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

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

相关资料