guava cache reload返回新旧值解析

1.调用guava cache的get方法,如果对应的key为空,那么会调用loader的load方法去加载对象并放置到cache中然后返回load方法返回的值
2.当比如设置expireAfterWrite为1s时,假设过期之前对应的key的值为oldValue,当1s过后,调用get方法去获取对应的key的value时,会触发loader的reload方法的调用,假设reload方法的调用的返回值为newValue,那么问题来了,此时get方法的返回值时什么?是旧的oldvalue还是新的reload返回的newValue?

答案是都有可能,为什么呢?在这里插入图片描述
可以看到源码中get线程在调用reload触发另外的线程池去加载newValue的之后,会判断对应的加载newValue的操作是否已经执行完,如果执行完了,那么就返回newValue,否则返回oldValue,所以说返回新或者旧value的值都有可能。但是我们也知道另外的线程池去加载获取newValue也是需要时间的,而get线程是不会等待另外线程池的加载newValue操作的,所以get操作极大概率会返回旧值。只有极端情况,比如线程切换,这样另外的线程池加载完newValue后再切换回get方法的线程时,get线程发现newValue已经加载完成,此时就会返回newValue的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值