expireAfterAccess
方法的javadoc说:
指定应自动从中删除每个条目 在条目创建后经过固定的持续时间后缓存, 最近更换其价值或其最后访问权限。访问 所有缓存读写操作都会重置时间(包括 Cache.asMap()。get(Object)和Cache.asMap()。put(K,V)),但不是 对Cache.asMap的集合视图的操作
我有以下代码:
Cache<String, String> cache = CacheBuilder.newBuilder()
.expireAfterAccess(2, TimeUnit.SECONDS)
.build();
ConcurrentMap<String, String> map = cache.asMap();
map.put("a", "12345");
System.out.println("First access: " + map.get("a"));
System.out.println("Second access: " + map.get("a"));
Thread.sleep(1900); //1.9 seconds
System.out.println("Third access: " + map.get("a"));
Thread.sleep(1000); //1 second
System.out.println("Fourth access: " + map.get("a"));
Thread.sleep(1500); //1.5 second
System.out.println("Fivth access: " + map.get("a"));
它的输出是:
First access: 12345
Second access: 12345
Third access: 12345
Fourth access: 12345
Fivth access: 12345
因此,我们可以看到,当我们对集合视图执行get操作时,也会重置访问时间。在这种情况下,javadoc中的粗体短语是什么意思?
答案 0 :(得分:3)
对Cache.asMap的集合视图的操作
Map
Cache
上的观看的keySet()
公开的集合是values()
,entrySet()
,{ {1}}。对其中任何一个进行迭代都不会重置访问时间,也不会写入通过Map.Entry
获得的entrySet()
的值。