SharePerenference原理

1.SharePerenference的存储格式
2.缓存策略是怎样的
3.线程安全的处理方式

1.以xml文件存储key-value形式的数据,加载的方式是一次加载整个文件内容到内存中,在内存中的对应方式为,先找到所属包名的缓存ArrayMap,再根据filename找到对应的SharedPreferences的实现对象SharedPreferencesImpl.在业务中调用的api最终都委托给了该对象来处理。
SharedPreferencesImpl对象
中包含该对象负责管理的具体的xml文件,在创建该对象时,该对象内部会启用一个线程去加载对应xml中所有的内容到内容中(加载的buffer缓冲区大小为16kb,所以最好每个xml文件不要太大,且能充分利用缓冲区减少打开文件的次数和读写次数),并将数据项以key-value的形式存储在其内部的map对象中,我们常规的get操作都是直接获取map中对应的key-value值。
2.SharePerenference中的缓存分为两种:磁盘缓存和内存缓存。磁盘缓存的写入是全量写入,每次写入时都是以覆盖的方式全量写入原xml文件。写入的线程选择策略根据调用的api不同。当使用apply方法时,会先将本次更新的数据项都同步到内存缓存map中,然后post一个runnable到异步线程队列中。而采用commit方法时,则会直接在当前线程将已更新的内存缓存map全量写入到xml文件中,是一个阻塞过程。如果xml文件过大的话,很容易造成卡顿。如果采用异步队列的方式,有可能在程序退出时任务还没有被执行,所以异步队列提供了waitToFinish方法,希望在Activity的onPause方法被调用时强制将内存缓存写入到磁盘。
3.线程安全的处理上使用了对象锁+CountDownLatch的方式。CountDownLatch常用于,某组任务都执行完毕的信号通知和阻塞。其实现原理是基于CAS校验的AQS。

你可能感兴趣的:(android)