前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SharedPreferences三问—bilibili真题

SharedPreferences三问—bilibili真题

作者头像
码上积木
发布2020-10-29 16:41:28
1.2K0
发布2020-10-29 16:41:28
举报
文章被收录于专栏:码上积木

作为一个轻量级的存储方式,SharedPreferences一直用来保存简单的配置信息,今天我们就来一起深入了解下它:

  • SharedPreferences是如何保证线程安全的,其内部的实现用到了哪些锁
  • 是进程安全的吗?如果是不安全的话我们作为开发人员该怎么办?
  • SharedPreferences 操作有文件备份吗?是怎么完成备份的?

SharedPreferences是如何保证线程安全的,其内部的实现用到了哪些锁

SharedPreferences的本质是用键值对的方式保存数据到xml文件,然后对文件进行读写操作。

  • 对于读操作,加一把锁就够了:
代码语言:javascript
复制
public String getString(String key, @Nullable String defValue) {
    synchronized (mLock) {
        String v = (String)mMap.get(key);
        return v != null ? v : defValue;
    }
}
  • 对于写操作,由于是两步操作,一个是editor.put,一个是commit或者apply所以其实是需要两把锁的:
代码语言:javascript
复制
//第一把锁,操作Editor类的map对象
public final class EditorImpl implements Editor {
  @Override
  public Editor putString(String key, String value) {
      synchronized (mEditorLock) {
          mEditorMap.put(key, value);
          return this;
      }
  }
}


//第二把锁,操作文件的写入
synchronized (mWritingToDiskLock) {
    writeToFile(mcr, isFromSyncCommit);
}

是进程安全的吗?如果是不安全的话我们作为开发人员该怎么办?

1) SharedPreferences是进程不安全的,因为没有使用跨进程的锁。既然是进程不安全,那么久有可能在多进程操作的时候发生数据异常。

2) 我们有两个办法能保证进程安全:

  • 使用跨进程组件,也就是ContentProvider,这也是官方推荐的做法。通过ContentProvider对多进程进行了处理,使得不同进程都是通过ContentProvider访问SharedPreferences。
  • 加文件锁,由于SharedPreferences的本质是读写文件,所以我们对文件加锁,就能保证进程安全了。

SharedPreferences 操作有文件备份吗?是怎么完成备份的?

  • SharedPreferences 的写入操作,首先是将源文件备份:
代码语言:javascript
复制
  if (!backupFileExists) {
      !mFile.renameTo(mBackupFile);
  }
  • 再写入所有数据,只有写入成功,并且通过 sync 完成落盘后,才会将 Backup(.bak) 文件删除。
  • 如果写入过程中进程被杀,或者关机等非正常情况发生。进程再次启动后如果发现该 SharedPreferences 存在 Backup 文件,就将 Backup 文件重名为源文件,原本未完成写入的文件就直接丢弃,这样就能保证之前数据的正确。

参考

https://juejin.im/post/6884505736836022280

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上积木 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SharedPreferences是如何保证线程安全的,其内部的实现用到了哪些锁
  • 是进程安全的吗?如果是不安全的话我们作为开发人员该怎么办?
  • SharedPreferences 操作有文件备份吗?是怎么完成备份的?
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档