我使用的是Guava的Cache<Key, Value>
。每当Key
不再是强可访问的,缓存条目就应该被垃圾收集(总有一天…)。如果没有从Value
返回到Key
的引用,使用CacheBuilder.weakKeys()
就可以做到这一点。
我可以使这个引用变弱,但这随时可能使我的Value
完全无效。我可以应付,但我不愿意。
我可以使用weakValues()
,但这可能会导致很早的驱逐,因为我的值只在很短的时间内被引用。
也许我可以用softValues()
,但SoftReference
已经坏了。
也许我做错了什么。。。。什么是正确的解决方案?
更新
我所需要的可以简单地通过在每个Key
中引用Value
来实现,但这是不可能的,因为Key
不在我的控制之下。如果是,那么我就不需要缓存,不需要弱引用,什么都不需要。
这样,每个Key
将保持其对应的Value
可到达,这是很好的1。此外,每个Value
都会保持其Key
的可达性,但这没有问题,因为对Value
的引用已经不存在了。
1有些过期会更好,但没有必要。
不幸的是,如果没有星历子,这是无法解决的。
只要没有其他指针保持在Value上,Value->Key的指针就无关紧要。
当缓存转储Key时,它将被收集。
如果您有系统->缓存->密钥<-值,当缓存丢弃密钥时,您将得到System->Cache key<-价值从密钥备份到系统(本例中为内存根)的链接已断开,密钥将被恢复。
如果你真的想要weakKeys,那么从值到键的弱引用是正确的做法。
如果你觉得这不合适,那么请提供更多关于你正在努力实现的目标的信息。
您认为有可能创建密钥的副本,并将其用作映射中的密钥吗?我想你可能有类似的东西
Value v = SomeLibrary.giveMeSomething();
String k = v.getName();
String k1 = new String(k);
cache.put(k1,v);
这将起作用b/c k等于(k1)和k!=k1.希望您可以创建一个用于Key的类型的副本或克隆(在您的情况下可能不是String)。
但是,这会更改密钥的生命周期,因为它不再是Value中的密钥。如果你可以控制你放在地图上的特定对象的生命周期,那么你就可以了
你认为这可行吗?