缓存机制

11 篇文章 0 订阅

缓存机制

  • 二级缓存:内存 -> 硬盘 -> 网络

    当查找数据时,先从内存中查找,若无则查找硬盘,若无再请求网络
    当从网络获取数据后,同时存储到内存和硬盘中

缓存框架

  • LruCache 内存缓存 DiskLruCache 硬盘缓存
  • ASimpleCache(ACache)
  • RxCache

缓存机制

  • 类似Glide之类的大型框架都是使用自己的缓存机制
  • 类似Message里面的缓存就运用了享元池
    // sometimes we store linked lists of these things
    // 指向对象池下一个对象的指针
    /*package*/ Message next;
    // 对象池的锁,互斥访问
    private static final Object sPoolSync = new Object();
    // sPool始终指向链表队首
    private static Message sPool;
    // 当前链表数据量
    private static int sPoolSize = 0;
    // 对象池容量
    private static final int MAX_POOL_SIZE = 50;
    
    /**
     * Return a new Message instance from the global pool. Allows us to
     * avoid allocating new objects in many cases.
     */
    public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                m.flags = 0; // clear in-use flag
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }
    
    对象池若一开始为空时,则只返回一个Message对象,消息被回收时,调用recycle()回收方法,会初始化对象池,然后消息被清除数据并且加入到链表的头部
    synchronized (sPoolSync) {
        if (sPoolSize < MAX_POOL_SIZE) {
            next = sPool;
            sPool = this;
            sPoolSize++;
        }
    }    
    
  • 在Message中,享元模式的具体实现是链表,而其它使用场景中,缓存对象的容器实际上是可以随便切换的,例如你想用HashMap之类的也是可以的。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值