Google Guava 缓存取值为null

在使用Guava作为本地缓存的时候,已经添加的缓存,用getIfPrensent获取为空。

 

cache创建代码如下:

public static Cache<Integer, Map<String, String>> cache = CacheBuilder.newBuilder().initialCapacity(1000)
            .expireAfterAccess(60, TimeUnit.SECONDS)
            .removalListener(removalListener)
            .weakKeys()
            .weakValues()
            .build();

获取缓存会出现以下情况:

1)cache中有内容,但是getIfPrensent获取为空。

2)cache中没有内容,但是debug的过程中看到localCache有put成功。

3)cache中有内容,getIfPrensent能成功获取。

 

解决办法:删除创建cache时的 .weakKeys().weakValues()。

 

思路:

弱引用有以下特点:

1)弱引用只能用==比较,不能用equals

2)弱引用在没有其它(强或软)引用时,缓存项可以被垃圾回收

3)WeakHashMap应用于以下场景:

我们将一个Object作为key存到hashMap中,如果key没用了,我们将这个key==null,但是只要hashMap是活跃的,map中的对象永远无法被回收,因为程序中不再出现key了,所以这个键值对也无法从map中移除。

如果使用WeakHashMap,程序会周期性的检查没有其他强或软引用的key,并删除对应条目。

猜测Guava的缓存获取数据应该是走的ConcurrentHashMap的逻辑,通过equals来比较,所以有值的时候找不到,没有强引用的时候,对象有可能被回收。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章