gpt4 book ai didi

java - Guava map 中驱逐的懒惰

转载 作者:搜寻专家 更新时间:2023-11-01 01:57:17 26 4
gpt4 key购买 nike

当前的 map 逐出算法非常懒惰。看起来过期对象只有在访问数据结构时才会被逐出。

例如,从地址到索引器的映射定义为:

ConcurrentMap<Address, Indexer> indexers = new MapMaker()
.expireAfterAccess( EXPIRATION, TimeUnit.SECONDS)
.evictionListener( new IndexEvicted())
.makeMap();

导致非常令人惊讶的模式:虽然给定地址的 containsKey() 返回 false,但在该地址的索引器被逐出后立即返回。

使清理过程更加实时的推荐方法是什么? IE。移除接近实际过期时间的对象。

更新:我想进一步阐明实时的含义。对于上面的示例,EXPIRATION 为 10 秒,我希望看到插入的对象在上次访问后 10 秒内被逐出。现在不会发生这种情况 - 必须以某种方式使用 map 来开始驱逐。如果 map 完全未被使用,该对象可以在那里停留多年。

最佳答案

为了及时驱逐,Guava 需要实现某种后台线程或定时重复任务。这样做会使 map 更重,更难在 J2EE 等环境或安全策略阻止线程随意生成的环境中使用。

如果您关心及时驱逐,请设置您自己的接触 map 的定时线程。

另一方面,我同意让垃圾收集器触发驱逐会很好......例如通过使用 SoftReference 和终结器。 (是的,我知道终结器大多是邪恶的,我只是建议一个可选的最后手段策略。)

关于java - Guava map 中驱逐的懒惰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5899383/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com