转载

java – 具有弱值的HashMap

我正在为持久存储的对象实现缓存.想法是:

>方法getObjectFromPersistence(long id); ///约3秒钟

>方法getObjectFromCache(long id)//即时

并有一个方法:getObject(long id)具有以下伪代码:

synchronized(this){
    CustomObject result= getObjectFromCache(id)
    if (result==null){
       result=getObjectFromPersistence(id);
       addToCache(result);
    }
    return result;
}

但是我需要允许自定义对象被垃圾回收器收集.到目前为止,我使用的是HashMap<Long,WeakReference<CustomObject>为执行.问题是在一段时间以来,HashMap成为空的WeakReferences的填补.

我已经检查了 WeakHashMap ,但是键是弱的(并且值仍然是很强的引用),所以有了WeakReferences的渴望是没有意义的.

解决这个问题的最佳解决方案是什么?有没有一些“反WeakHashMap”或类似的东西?

谢谢

您可以使用 Guava MapMaker

ConcurrentMap<Long, CustomObject> graphs = new MapMaker()
   .weakValues()
   .makeMap();

您甚至可以通过以下方式替换makeMap()来包含计算部分:

.makeComputingMap(
       new Function<Long, CustomObject>() {
         public CustomObject apply(Long id) {
           return getObjectFromPersistence(id);
         }
       });

由于您正在撰写的内容看起来很像缓存,所以更新更专业的 Cache (通过 CacheBuilder 构建)可能与您更相关.它不直接实现Map接口,而是可以为缓存提供更多的控件.

http://stackoverflow.com/questions/13413272/hashmap-with-weak-values

原文  https://codeday.me/bug/20181015/286613.html
正文到此结束
Loading...