3

我正在使用番石榴的Cache<Key, Value>. 只要Key不再强可达,缓存条目就应该被垃圾收集(有一天......)。CacheBuilder.weakKeys()如果没有从backValueKey.

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

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

也许我可以使用softValues(),但SoftReferences很破

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

更新

我需要的只是通过在Valueeach中添加一个引用来实现Key,但这是不可能的,因为Key不在我的控制之下。如果是,那么我不需要缓存,不需要弱引用,什么都不需要。

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


1一些到期会更好,但不是必须的。

4

4 回答 4

2

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

于 2012-07-16T22:34:54.147 回答
1

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

当 Cache 转储 Key 时,它会被收集。

如果您有 System->Cache->Key<-Value,当 Cache 丢弃键时,您将获得 System->Cache Key<-Value。从 Key 备份到 System(此示例的内存根)的链接已断开,Key 将被恢复。

于 2012-07-12T06:04:40.870 回答
1

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

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

于 2012-07-12T15:21:41.773 回答
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 中的那个。如果您可以控制放置在地图中的特定对象的生命周期,那么您就可以了。

你认为这可能奏效吗?

于 2012-07-23T08:11:59.703 回答