Guava Cache提供了三种清理或者刷新策略
expireAfterAccess 和 expireAfterWrite 的处理类似,都是先去判断是否过期,过期则设置过期,然后都获取锁、判断是否加载、获取值、释放锁,每个都要走整个获取锁的流程。锁的过程是从感知到expire到load到新值为止
refreshAfterWrite 会走单独的分支,去判断是否需要刷新,需要则加锁,执行reload 然后释放,其他的则先判断是否在load,然后再去加锁,但是锁的粒度更小,所以效率会高一点。锁的过程是insertLoadingValueReference的一个小对象的new和set操作,几乎可以忽略不计
load和reload方法,一个是前者用的一个后者用的,默认实现下,reload就会直接调用load方法 具体源代码见:com.google.common.cache.LocalCache.LoadingValueReference#loadFuture
1:判断expireAfterAccess 和 expireAfterWrite 是否过期
2:判断refreshAfterWrite 是否过期,过期则重新加载
3:到这里说明过期了或者没找到,都去load,这里会涉及到锁整个load过程
et/qq_21383435/article/details/108835727)