java 弱引用缓存,关于java:当值返回键时如何缓存弱引用?

我正在使用番石榴的Cache。每当Key无法再更严格地到达时,就应该对垃圾回收项进行垃圾收集(总有一天……)。如果没有从Value到Key的引用,则使用CacheBuilder.weakKeys()可以做到这一点。

我可以使此引用无效,但这可以随时使Value完全无效。我可以处理,但我不愿意。

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

也许我可以使用softValues(),但是SoftReference却很坏。

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

更新资料

只需在每个Key中放置对Value的引用,就可以实现我所需要的,但这是不可能的,因为Key不在我的控制之下。如果是这样,那么我就不需要缓存,不需要弱引用,也不需要任何东西。

这样,每个Key都会保持其对应的Value可达,也就是fine1。同样,每个Value都将保持其Key的可访问性,但这没有问题,因为不再存在对Value的引用。

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

如果您可以控制值,请按Key key,WeakReference键。 如果我可以控制这些键并需要这样的功能,则倾向于在键weakThis中添加一个最终字段,以节省WeakReferences的数量。

不幸的是,没有星历表是无法解决的。

您的链接已失效,此链接有效。

阅读本文后,我认为您是对的。我碰到了"属性表"下描述的问题,该问题需要使用星历表。万一有人在意:我发现了一个非常简单的星历定义:它是一个键值对,如果星历及其键都可以到达,则值字段可以到达。

有什么好办法可以例如一个WeakHashMap,给定一个与集合中一个匹配的字符串的引用,它将返回集合中的一个,但是会丢弃集合之外不存在引用的字符串?将每个值都设为WeakReference可能是可行的,但似乎有些棘手,因为该集合已经保存了一个完美的WeakReference。

如果您确实需要weakKeys,那么从值到键的弱引用是正确的选择。

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

实际上,我不能让Value引用Key的原因比我想象的要复杂。我现在不打算讨论这个问题,但是我补充了一些我需要的内容。

只要没有其他东西保持Value不变,Value-> Key的指针就无关紧要。

当缓存转储密钥时,将对其进行收集。

如果具有System-> Cache-> Key Cache Key

我认为它永远不会发生。有一个System->Cache->Value->Key链持续存在,直到该条目被逐出为止,即直到仅使用weakKeys()时永久存在。

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

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

您认为这可行吗?

不是我的情况...问题是值中对(原始)键的引用,这些键使键可访问。查看您接受的答案,以防您感兴趣。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值