【问题标题】:Where should I synchronize on this static SharedPreference helper class?我应该在哪里同步这个静态 SharedPreference 助手类?
【发布时间】:2012-11-18 11:48:46
【问题描述】:

我创建了一个以静态方式持有 SharedPreferences 访问权限的类。查看AOSP ContextImpl.java的SharedPreferenceImpl,我看到synchronized(this)在执行putget时使用。

我还应该在下面的代码中添加synchronized 吗?

public class AppPreferences {
  // Get static SharedPreferences Editor
  private static Editor getEditor(Context ctx) {
    return PreferenceManager.getDefaultSharedPreferences(ctx).edit();
  }
  // Get static SharedPreferences
  private static SharedPreferences getPref(Context ctx) {
    return PreferenceManager.getDefaultSharedPreferences(ctx);
  }
  public static String getUserName(Context ctx, String defaul) {
    return getPref(ctx).getString("user_name", defaul);
  }
  public static void setUserName(Context ctx, String text) {
    getEditor(ctx).putString("user_name", text).commit();
  }
}

【问题讨论】:

标签: android sharedpreferences synchronized


【解决方案1】:

android.app.ContextImpl 中有一个static field

private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
         new HashMap<String, SharedPreferencesImpl>();

(除了private static final HashMap ?! /aside)。
这是填充here。因此,共享相同上下文的应用程序中的所有线程(我已经问过here,但我仍然不是 100% 确定)将共享 SharedPreferencesImpl 实例的静态映射 - 现在,无论何时调用 edit(),你都会得到一个 @987654324 @ - 所以在你的问题中提到的“同步(this)”中,this 是指手头的 EditorImpl 的实例 - 它没有多大作用 - 它只是同步对内部映射的访问EditorImpl。但是(不同的)编辑器在(commonSharedPreferencesImpl 实例上进行同步,当他们要修改这个(SharedPreferencesImpl)实例时。所以在commit() 例如commitToMemory()called 同步is on SharedPreferencesImpl.this。请记住,尽管对磁盘的写入是按随机顺序排列的(请参阅enqueueDiskWriteSo 的 javadoc 并在 commit 中注意,在写入内存和排队写入磁盘之间没有锁定)。因此,只要您不依赖于修改顺序并且不依赖于 atomically 检查 设置首选项值(这需要同步你自己的)
注意我引用的代码适用于 2.3.1_r1 - 希望仍然有效

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2016-07-23
    • 2017-10-20
    • 1970-01-01
    • 2018-04-24
    相关资源
    最近更新 更多