原理可以参考下这个:
https://blog.csdn.net/hellozhxy/article/details/119757733
最近在项目上,也使用到了这个LRU,,我们也来解析下这个LRU的实现
我们自己创建一个类,继承 LinkedHashMap<K,V>,基于LinkedHashMap来实现线程安全的我们自己的LRU
根据实际情况,决定使用 ReentrantReadWriteLock 还是 ReentrantLock,,,前面那种适合于读多写少的情况,,性能几乎没有损耗,我这边选择读写锁
ReentrantReadWriteLock 是读读不互斥,读写互斥,写写互斥
我们要重写关键性的方法 removeEldestEntry(final java.util.Map.Entry<K, V> eldest)
说明当超过阈值的时候,这个方法的返回值会变成true
而原来的LinkedHashMap的这个方法是返回false的,我们直接重写掉
这时候我们来看put()方法的源码,继承的是HashMap的put()方法
可以看到这个 afterNodeInsertion()方法
可以看到,这边调用了 removeEldestEntry(),,我们自己重写的方法如果是true的话,那么就会删除掉
当某个位置被命中,通过调整链表的指向将该位置调整到头位置,新加入的内容直接放在链表头,如此一来,最近被命中的内容就向链表头移动,需要替换时,链表最后的位置就是最近最少使用的位置,那么就会被删掉
标签:记录,重写,链表,互斥,算法,LRU,方法,LinkedHashMap From: https://www.cnblogs.com/lovewudoudouforever/p/16825517.html