【问题标题】:How to cache with weak references when values refer back to keys?当值引用键时如何使用弱引用进行缓存?
【发布时间】:2012-07-12 06:01:43
【问题描述】:

我正在使用 Guava 的 Cache<Key, Value>。每当Key 不再强可达时,缓存条目应该被垃圾收集(总有一天......)。如果没有从 ValueKey 的引用,则使用 CacheBuilder.weakKeys() 可以做到这一点。

我可以使这个引用变弱,但这可能随时使我的Value 完全无效。我可以处理它,但我不想这样做。

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

也许我可以使用softValues(),但SoftReferences 是quite broken

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

更新

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

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


1有些过期会更好,但不是必须的。

【问题讨论】:

  • 如果您可以控制价值,请创建Key keyWeakReference<Key> 键。如果我可以控制密钥并需要此类功能,我倾向于在密钥 weakThis 中添加一个最终字段,以节省 WeakReferences 的数量。

标签: java caching guava weak-references


【解决方案1】:

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

【讨论】:

  • 您的链接已失效,this one works
  • 阅读完论文后,我认为您是对的。我正好遇到了“属性表”下描述的问题,它需要蜉蝣。万一有人关心:我找到了一个非常简单的 ephemeron 定义:它是一个键值对,如果 ephemeron 及其键都可访问,则 value 字段是可访问的。
  • 有没有什么好的方法可以有一个例如一个WeakHashMap<string,string>,给定一个对与集合中的一个匹配的字符串的引用,将返回集合中的那个,但它会丢弃在集合之外不存在引用的字符串?将每个值设为 WeakReference 可能是可能的,但似乎有点恶心,因为该集合已经拥有一个 WeakReference,这非常完美。
【解决方案2】:

来自 Value -> Key 的指针无关紧要,只要没有其他东西持有 Value。

Cache转储Key时,会被收集。

如果您有 System->Cache->KeyCache Key

【讨论】:

  • 我认为这不会发生。有一个链 System->Cache->Value->Key 一直存在,直到条目被驱逐,即,只有 weakKeys() 被使用时永远存在。
【解决方案3】:

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

如果您觉得这不合适,请提供更多关于您想要完成的工作的信息。

【讨论】:

  • 其实我不能让Value引用Key的原因比我想象的要复杂。我现在不打算讨论这个,但我已经添加了一些我需要的解释。
【解决方案4】:

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

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 中的那个。如果您可以控制放置在地图中的特定对象的生命周期,那么您就可以了。

你认为这可行吗?

【讨论】:

  • 在我的情况下不是......问题是对值中(原始)键的引用使键可访问。如果您有兴趣,请查看已接受的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多