背景信息
您可以使用LinkedHashMap来创建一个LRU缓存,如此链接所示。基本上,您需要:
- 扩展链式哈希映射。
- 提供容量参数。
- 使用参数初始化超类(LinkedHashMap),告诉它容量、比例因子(永远不应该使用)和保持插入/引用顺序的项目。
- 重写removeEldestEntry以在容量被超出时删除最旧的条目。
我的问题
这是一个相当标准的LRU缓存实现。但是我无法弄清楚如何在LinkedHashMap由于最近没有使用而删除一个条目时得到通知。
我知道我可以让removeEldestEntry提供某种形式的通知...但是否有任何方法在向底层映射插入新元素(put)时立即检索从缓存中删除的元素?或者,是否有一种方法查询最后一个从缓存中删除的项目?
put
是不合适的,因为它会破坏Map
的契约。线程本地变量存在的目的是允许并发(我将它们设置为非静态以更好地使用通用类型,但静态也可以)。如果没有线程本地变量,您最终会将值存储在实例变量中,在缓存并发使用期间会引入竞争条件,即使您在其周围放置了同步包装器。 - Sergey Kalinichenko