我正在为持久存储的对象实现缓存.想法是:
>方法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”或类似的东西?
谢谢
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