Java 当值引用回键时,如何使用弱引用缓存?

Java 当值引用回键时,如何使用弱引用缓存?,java,caching,guava,weak-references,Java,Caching,Guava,Weak References,我用的是番石榴的缓存。每当键不再具有强可访问性时,应该对缓存项进行垃圾收集(某天…)。如果没有从Value返回到键的引用,那么使用CacheBuilder.weakKeys()就可以做到这一点 我可以使这个引用变弱,但这可能会使我的值变得非常无效。我能应付,但我不想 我可以使用weakValues(),但这可能会导致很早的驱逐,因为我的值只被引用了很短的时间 也许我可以使用softValues(),但是SoftReference是 可能是我弄错了什么。。。。正确的解决方案是什么 更新 只需在每个

我用的是番石榴的
缓存
。每当
不再具有强可访问性时,应该对缓存项进行垃圾收集(某天…)。如果没有从
Value
返回到
键的引用,那么使用
CacheBuilder.weakKeys()
就可以做到这一点

我可以使这个引用变弱,但这可能会使我的
值变得非常无效。我能应付,但我不想

我可以使用
weakValues()
,但这可能会导致很早的驱逐,因为我的值只被引用了很短的时间

也许我可以使用
softValues()
,但是
SoftReference

可能是我弄错了什么。。。。正确的解决方案是什么

更新 只需在每个
中加入对
的引用,就可以实现我所需的功能,但这是不可能的,因为
不在我的控制之下。如果是,那么我就不需要缓存,不需要弱引用,什么都不需要

这样,每个
将保持其对应的
可访问,即fine1。此外,每个
都将保持其
可访问,但这没有问题,因为不再存在对
的引用



1一些过期时间会更好,但这不是必需的。

只要没有其他东西保留值,值->键的指针就不重要

当缓存转储密钥时,它将被收集


如果您确实想要weakKeys,那么从值到键的弱引用是正确的做法


如果您觉得这不合适,那么请提供有关您试图完成的任务的更多信息。

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

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

Value v = SomeLibrary.giveMeSomething();
String k = v.getName();
String k1 = new String(k);
cache.put(k1,v);
这将工作b/c k等于(k1)和k!=k1。希望您可以创建用于密钥的类型的副本或克隆(在您的示例中可能不是字符串)

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


你认为这样行吗?

我认为这种事永远不会发生。有一个链
System->Cache->Value->Key
,它会一直持续到条目被逐出,也就是说,只有
weakKeys()
被使用时,它才会一直存在。实际上,我不能让
Value
引用
Key
的原因比我想象的要复杂得多。我现在不打算讨论这个问题,但我已经补充了一些我需要的解释。你的链接已经死了。看完报纸后,我发现你是对的。我正好遇到了“属性表”下描述的问题,它需要星历表。如果有人关心:我发现了一个非常简单的蜉蝣的定义:它是一个键值对,当蜉蝣和它的键都是可访问的时,值字段是可访问的。有没有什么好的方法来创建一个例如a
WeakHashMap
的函数,如果给定一个与集合中的字符串匹配的字符串的引用,将返回集合中的字符串,但会删除集合外不存在引用的字符串?让每个值都是一个
WeakReference
可能是可能的,但似乎有点讨厌,因为集合已经拥有了一个
WeakReference
,这非常完美。我的情况不是这样。。。问题是值中对(原始)键的引用使键保持可访问性。如果您感兴趣,请查看接受的答案。如果您可以控制值,请按
WeakReference键。如果我可以控制键并需要这样的功能,我倾向于在键
weakThis
中添加最后一个字段,以保留weakreference的数量。