美文网首页
DiskLruCache学习

DiskLruCache学习

作者: vb12 | 来源:发表于2017-10-12 21:45 被阅读24次

    每次见到这个类, 感觉都明白它在做什么,  细想起来又不知道它是怎么做的,  于是花了点时间好好看了看里面的逻辑.

    具体代码逻辑可以参看:

    http://blog.csdn.net/lmj623565791/article/details/47251585

    问题:

    在get(key)   edit(key) 操作中怎么做到的多线程下的同步?

    -- 就是简单的在整个get方法上添加了synchronized 标志.  同步的对象都是diskLruCache对象本身.   好粗暴啊.

    readable这个状态到底是什么意思?

    ---感觉就是代表了CLEAN状态.

    通过snapshot生成edit时, 怎么保证数据实时最新?

    --- 通过为每个entry对象增加一个sequenceNumber状态,   如果这个值没变, 那说明生成snapshot之后, entry值没有变化过.  反之则不然.

    并且通过entry.currentEditor是否为null来判断,  是否正在进行修改.

    难道每次都要把journal文件中所有的数据行, 都要分析处理一遍吗?  老的数据还有必要保留吗?

    ------ 看来是,  当行数超过最大限制时,  会重建journal文件.

    journal.tmp  和 journal.bkp两个文件有什么不同的用处?

    .bkp文件是在重建journal时, 先把现有的journal文件修改为.bkp文件,  然后再设置新的journal文件. 其实就是一个备份journal文件的功能, 避免在重建时丢失现有数据.

    在一个非常小的时间段序列上, 如果发生了异常,  那么可能只有.bkp文件存在, 原来的journal文件丢失了,  那么下次open操作时, 就需要把.bkp文件恢复成journal文件.

    .tmp文件是重建journal时使用的辅助文件, 先创建一个tmp文件, 写入所有需要的数据.  然后把tmp文件修改成最终的新的journal文件.

    什么情况下会需要重建journal文件?

    每次有修改数据的操作, 比如edit()保存, 删除remove()  最后都会检查是否需要重建,   判断的直接条件就是尺寸是否超过最大尺寸,  已经垃圾操作redundantOpCount是否大于2000

    相关文章

      网友评论

          本文标题:DiskLruCache学习

          本文链接:https://www.haomeiwen.com/subject/yexayxtx.html