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