DiskLruCache学习

2017-10-12  本文已影响24人  vb12

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

具体代码逻辑可以参看:

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

上一篇下一篇

猜你喜欢

热点阅读