Guava的expireAfterAccess缓存在集合视图上

时间:2013-06-20 16:03:10

标签: java caching guava

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中的粗体短语是什么意思?

1 个答案:

答案 0 :(得分:3)

  

对Cache.asMap的集合视图的操作

Map Cache上的观看keySet()公开的集合values()entrySet(),{ {1}}。对其中任何一个进行迭代都不会重置访问时间,也不会写入通过Map.Entry获得的entrySet()的值。