您将如何在Java中实现LRU缓存?

问题:

请不要说EHCache或OSCache等。假设为了这个问题的目的,我想实现我自己使用的只是SDK(通过做)。鉴于缓存将在多线程环境中使用,您将使用哪些数据结构?我已经使用LinkedHashMapCollections#synchronizedMap实现了一个,但是如果任何新的并发集合将是更好的候选人,我很好奇。
更新:当我发现这个块时,我正在阅读Yegge’s latest

如果您需要定期访问并希望维护插入顺序,那么您不能比LinkedHashMap更好,这是一个真正精彩的数据结构。唯一可能会更美妙的是如果有并发版本。可惜。

在我上面提到的LinkedHashMap + Collections#synchronizedMap实现之前,我正在考虑几乎完全相同的事情。很高兴知道我不只是忽略了一些东西。
根据迄今为止的答案,听起来我最好的一个高度并发的LRU将是使用LinkedHashMap使用的相同逻辑来扩展ConcurrentHashMap

回答:

我喜欢很多这些建议,但现在我觉得我会坚持使用LinkedHashMap + Collections.synchronizedMap。如果我以后再重新考虑一下,我可能会以LinkedHashMap扩展HashMap的方式扩展ConcurrentHashMap
更新:
根据请求,这是我目前实现的要点。

private class LruCache<A, B> extends LinkedHashMap<A, B> {
    private final int maxEntries;

    public LruCache(final int maxEntries) {
        super(maxEntries + 1, 1.0f, true);
        this.maxEntries = maxEntries;
    }

    /**
     * Returns <tt>true</tt> if this 

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How would you implement an LRU cache in Java?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

78 − 76 =