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来比较,所以有值的时候找不到,没有强引用的时候,对象有可能被回收。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值