浅析Afinal框架FinalBitmap缓存lru内存释放实现

说明:最近在学习Afinal框架,将一些心得分享给大家~

Afinal框架FinalBitmap缓存lru内存释放实现,核心是维护一个有最大值得LinkedHashMap:

1.FinalBitmap缓存通过类LruMemoryCache实现,以下是构造方法。初始化了最大缓存数量和初始化了一个LinkedHashMap对象。LinkedHashMap第一个参数表示实例化时容器大小,这里为0,会获得一个大小为1的容器,

第二个参数是一个因子,表示什么时候扩容(容器使用量为最大容量*因子时,容量扩大一倍),第三个参数是Lru算法的关键。true表示按照使用情况排序,false表示按照插入排序。

public LruMemoryCache(int maxSize) {
        if (maxSize <= 0) {
            throw new IllegalArgumentException("maxSize <= 0");
        }
        this.maxSize = maxSize;
        this.map = new LinkedHashMap<K, V>(0, 0.75f, true);
    }

2.缓存插入put()算法,以下是源代码,可以看到put方法不允许有空的key或value,插入完成后,会执行entryRemoved的方法,该方法在LruMemoryCache中并没有任何操作。最后trimToSize()方法对容器进行了调整。

<pre style="font-family: Consolas; font-size: 12pt; background-color: rgb(255, 255, 255);"><pre name="code" class="java">public final V put(K key, V value) {
        if (key == null || value == null) {
            throw new NullPointerException("key == null || value == null");
        }
        V previous;
        synchronized (this) {
            putCount++;
            size += safeSizeOf(key, value);
            previous = map.put(key, value);
            if (previous != null) {
                size -= safeSizeOf(key, previous);
            }
        }

        if (previous != null) {
            entryRemoved(false, key, previous, value);
        }
        trimToSize(maxSize);
        return previous;
    }

 
 3.trimToSize实现通过循环自减实现: 

while (true) {
..
synchronized (this) {
..
if (size <= maxSize || map.isEmpty()) {
break;
}
Map.Entry<K, V> toEvict = map.entrySet().iterator().next();
key = toEvict.getKey();
..
map.remove(key);
size -= safeSizeOf(key, value);//safeSizeOf(key, value)为1
..
}
}
到这里基本上lru的实现已经比较清晰了。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值