gpt4 book ai didi

java - 具有弱值的 HashMap

转载 作者:IT老高 更新时间:2023-10-28 20:33:02 25 4
gpt4 key购买 nike

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

  • 方法getObjectFromPersistence(long id); ///Takes about 3 seconds
  • 方法getObjectFromCache(long id) //Instantly

并且有一个方法:getObject(long id),伪代码如下:

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

但我需要允许垃圾收集器收集 CustomObject。到目前为止,我一直在使用 HashMap<Long,WeakReference<CustomObject> 来实现。问题是随着时间的推移 HashMap 变成了空的 WeakReferences

我检查了 WeakHashMap,但那里的键很弱(并且值仍然是强引用),所以使用 Wea​​kReferences 的 long 没有意义。

解决此问题的最佳解决方案是什么?是否有一些“逆 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 接口(interface),但提供了更多您可能需要的缓存控件。

您可以引用this有关如何使用 CacheBuilder 的详细信息,这里是一个快速访问的示例:

LoadingCache<Integer, String> cache = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(
new CacheLoader<Integer, String>() {
@Override
public String load(Integer id) throws Exception {
return "value";
}
}
);

关于java - 具有弱值的 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13413272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com