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來比較,所以有值的時候找不到,沒有強引用的時候,對象有可能被回收。

 

 

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