每次见到这个类, 感觉都明白它在做什么, 细想起来又不知道它是怎么做的, 于是花了点时间好好看了看里面的逻辑.
具体代码逻辑可以参看:
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