guava cache reload返回新旧值解析

tech2022-09-04  105

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的值

最新回复(0)