Guava LocalCache源码分析:LocalCache的get、put、expand、refresh、remove、clear、cleanUp(二)

Guava LocalCache源码分析:LocalCache的refresh、remove、clear、cleanUp

前言

refresh

LocalCache虽然可设置定时刷新,但其刷新机制更像为一种“懒刷新”。LocalCache的刷新接口scheduleRefresh与refresh,仅在子实现类的refresh方法被调用时调用或者在Entry被get时调用,即LocalCache本身并未设置额外线程对Entry进行更新,Entry的过期机制同理。其中,Entry被读取时的调用逻辑可见前篇

LocalCache的段内Entry刷新过程如下:

        V scheduleRefresh(
                ReferenceEntry<K, V> entry,
                K key,
                int hash,
                V oldValue,
                long now,
                CacheLoader<? super K, V> loader) {
   
            //如果有设置更新时长,且已经过了更新时长,且值不是正在加载中
            if (map.refreshes()
                    && (now - entry.getWriteTime() > map.refreshNanos)
                    && !entry.getValueReference().isLoading()) {
   
                //更新值并返回新值
                V newValue = refresh(key, hash, loader, true);
                if (newValue != null) {
   
                    return newValue;
                }
            }
            return oldValue;
        }
        
        @CanIgnoreReturnValue
        @CheckForNull
        V refresh(K key, int hash, CacheLoader<? super K, V> loader, boolean checkTime) {
   
            //为需要更新的hash-key申请加载引用,如果没申请到(即返回为null)则证明该值正在加载中,即不需要再刷新
            final LoadingValueReference<K, V> loadingValueReference =
                    insertLoadingValueReference(key, hash, checkTime);
            if (loadingValueReference == null) {
   
                return null;
            }
            //异步刷新
            ListenableFuture<V> result = loadAsync(key, hash, loadingValueReference, loader);
            if (result.isDone()) {
   
                try {
   
                    //阻塞直到返回结果,该过程不可被打断(即不可被打断的future.get)
                    return Uninterruptibles.getUninterruptibly(result);
                } catch (Throwable t) {
   
                    //错误已被记录,故无需重记录
                
  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值