当值引用键时,如何使用弱引用进行缓存?

时间:2012-07-12 06:01:43

标签: java caching guava weak-references

我正在使用Guava的Cache<Key, Value>。每当Key不再强烈可达时,缓存条目应该被垃圾收集(某天......)。如果CacheBuilder.weakKeys()没有引用返回Value,则使用Key就可以完成此操作。

我可以使这个引用变弱,但这可能随时使Value无效。我可以处理它,但我不愿意。

我可以使用weakValues(),但这可能导致非常早期的驱逐,因为我的价值仅在短时间内被引用。

也许我可以使用softValues(),但SoftReferencequite broken

可能我得错了......什么是正确的解决方案?

更新

只需将Value引用到每个Key中,我就可以实现所需,但这是不可能的,因为Key不在我的控制之下。如果是,那么我不需要缓存,没有弱引用,什么都不需要。

这样,每个Key都会保持相应的Value可达,这很好 1 。此外,每个Value都会保持其Key可访问,但这没有问题,因为对Value没有长时间的引用。


1 有些过期会更好,但没有必要。

4 个答案:

答案 0 :(得分:2)

不幸的是,如果没有ephemerons,这是无法解决的。

答案 1 :(得分:1)

来自Value的指针 - &gt;只要没有别的东西坚持价值,关键就无所谓了。

当Cache转储密钥时,它将被收集。

如果你有System-&gt; Cache-&gt; Key&lt; -Value,当Cache drop key时,你得到System-&gt; Cache Key&lt; -Value。

答案 2 :(得分:1)

如果你真的想要弱键,那么从值到键的弱引用是正确的。

如果您感觉不合适,请提供有关您要完成的更多信息。

答案 3 :(得分:0)

您是否认为可以创建密钥副本,并将其用作地图中的密钥?我想你可能会有像

这样的东西
Value v = SomeLibrary.giveMeSomething();
String k = v.getName();
String k1 = new String(k);
cache.put(k1,v);

这将工作b / c k.equals(k1)和k!= k1。希望您可以创建用于Key的类型的副本或克隆(在您的情况下可能不是String)。

然而,这会更改密钥的生命周期 - 因为它不再是Value中的密钥。如果您可以控制放在地图中的特定对象的生命周期,那么您就可以了。

你认为这可行吗?