【问题标题】:Making below LRU cache to work in multithreading enviorement in java使下面的LRU缓存在java中的多线程环境中工作
【发布时间】:2017-01-21 13:50:35
【问题描述】:

我现在已经在 java 中开发了一个 LRU 缓存,请建议我必须根据多线程诅咒对其进行自定义,所以请告知我需要在下面的程序中进行哪些更改以使其对多线程环境安全,下面是我的代码..

import java.util.LinkedHashMap;

public class LRUCache extends LinkedHashMap<Integer, String> {
    private static final long serialVersionUID = 1342L;

    private int cacheSize;  

    //In overridden method, we are saying that, remove entry only when we have reached cacheSize.
    //initialCapacity,loadFactor,accessOrder the ordering mode - true for
    // access-order, false for insertion-order

    public LRUCache(int size) {     
        super(size, 0.75f, true);
        this.cacheSize = size;
    }

    @Override
    // removeEldestEntry() should be overridden by the user, otherwise it will not 
    //remove the oldest object from the Map.
    protected boolean removeEldestEntry(java.util.Map.Entry<Integer,String> eldest) {
                return size() > cacheSize;
    }

     public static void main(String arg[]){

         LRUCache lruCache = new LRUCache(2);
         lruCache.put(1, "Object1");
          lruCache.put(2, "Object2");
          lruCache.put(3, "Object3");
          System.out.println(lruCache);
     }


} 

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    您在Google Caches 中有一个很好的缓存实现(可以使用 LRU)。

    在您的实现中,第一个不便之处在于 LinkedHashMap 不是线程安全的。

    最简单的解决方案是使用java.util.Collections.synchronizedMap(yourMap) 使其线程安全,但这不是最有效的解决方案。

    您的解决方案的第二个问题是它在访问密钥时没有更新密钥的使用(与最近最少使用策略一致)。

    例如,如果你这样做:

    LRUCache lruCache = new LRUCache(2);
    lruCache.put(1, "Object1");
    lruCache.put(2, "Object2");
    lruCache.get(1);              // Here value 1 is "used"
    lruCache.put(3, "Object3");
    System.out.println(lruCache);
    

    LRU 元素为 2,但添加 3 时会删除 1。该类正在实施先进先出策略 (FIFO)。

    我建议为 LRUCache 创建一个新类(或更好的接口),而不扩展 Map 并在内部使用 ConcurrentHashMap 来存储和查找键值。您需要将原始值与其他数据一起存储在值中以保持插入顺序。诀窍是每次执行 get() 时,都会删除并再次添加相同的值(以更新最后的访问顺序)。

    与您的问题类似:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 2011-11-13
      • 2015-07-19
      • 1970-01-01
      • 2010-12-06
      • 2012-05-29
      • 1970-01-01
      相关资源
      最近更新 更多