首页 > 编程语言 >记录下LRU算法的使用

记录下LRU算法的使用

时间:2022-10-25 17:33:59浏览次数:43  
标签:记录 重写 链表 互斥 算法 LRU 方法 LinkedHashMap

原理可以参考下这个:

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

相关文章