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



我使用的是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时,它将被收集。

如果您有系统->缓存->密钥&lt-值,当缓存丢弃密钥时,您将得到System->Cache key&lt-价值从密钥备份到系统(本例中为内存根)的链接已断开,密钥将被恢复。

如果你真的想要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中的密钥。如果你可以控制你放在地图上的特定对象的生命周期,那么你就可以了

你认为这可行吗?

相关内容

  • 没有找到相关文章

最新更新