gpt4 book ai didi

java - 为什么 Cache.asMap() 与 Cache.size() 不一致?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:00:48 24 4
gpt4 key购买 nike

在 Guava 图书馆,我很困惑为什么Cache.asMap()Cache.size()不一致, 除非 Cache.cleanUp()叫做。

Cache<Object, Object> cache = CacheBuilder.newBuilder()
.expireAfterWrite(1, TimeUnit.SECONDS)
.build();
cache.get(...);
...
//After some seconds, all entries are expired.
//cache.asMap() is EMPTY Map, but cache.size() != 0

所以我的问题是:Cache.asMap()Cache.size() 不一致是不是 bug?虽然我注意到 Cache.size() 的 javadoc 是:

  /**
* Returns the **approximate** number of entries in this cache.
*/

我只能猜测它与并发环境有关。Cache.cleanUp() 究竟做了什么?

最佳答案

Guava 的缓存是围绕锁摊销设计的,cleanUp 方法强制缓存达到一致的状态。 Map.size() 方法是一个近似值,但可能会计算由于过期或引用驱逐而等待删除的条目。应用程序很少对 Guava 缓存中近似值的可见性感兴趣,应用程序倾向于将缓存视为临时数据存储。对缓存与 Map 的不同期望导致 asMap 方法允许将缓存视为 map ,但不支持开发人员以这种方式感知它。

缓存的实现细节在 StrangleLoop 2011 session 中有介绍 slides . design document ConcurrentLinkedHashMap(Guava 缓存的派生来源)可能也很有趣,但描述的方法略有不同。

关于java - 为什么 Cache.asMap() 与 Cache.size() 不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10442846/

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