gpt4 book ai didi

java - Guava CacheBuilder 未按预期工作

转载 作者:行者123 更新时间:2023-12-01 16:53:51 24 4
gpt4 key购买 nike

嗨,我是谷歌 Guava 集合的新手,所以我需要会过期一段时间的集合。所以我编写了以下代码,但它不会在过期时间后删除数据。任何人都可以告诉我代码的问题是什么。

Cache<String, Object> cache = CacheBuilder.newBuilder()
.expireAfterAccess(2, TimeUnit.MILLISECONDS)
.build();
Object object = new Object();
cache.put(object.getId(), object);
System.out.println("size :" + cache.size());
Thread.sleep(50000);
System.out.println("After Size :" + cache.size());

我需要将对象添加到 map ,并且在过期时间段后它将从 map 中删除。但是线程前后的上面代码包含 map 中的对象。

最佳答案

expireAfterAccess 的 javadoc状态:

Expired entries may be counted in Cache.size(), but will never be visible to read or write operations. Expired entries are cleaned up as part of the routine maintenance described in the class javadoc.

这意味着即使使用 .size() 对条目进行计数,它们在任何其他操作中也不会可见。

这些无效条目将被自动删除。根据javadoc,这种情况发生在以下情况:

  • 使用 get 访问该条目:
    map 发现该条目已过时,直接将其删除。
  • 偶尔的缓存访问:
    有时访问.get()方法会触发内部清理,javadoc没有为此定义任何时间段.
  • 手动调用 Cache.cleanUp() :
    这会直接触发清理例程并删除所有过时的条目。

更多信息似乎在Github Wiki of the cache class中有解释。 .

如果您想在删除条目时收到通知,可以使用 RemovalListener 。您可以使用 .removalListener(...) 在缓存构建器上设置此监听器.

关于java - Guava CacheBuilder 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35453992/

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