1

我创建了一个以静态方式持有 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();
  }
}
4

1 回答 1

0

里面有android.app.ContextImpl一个静态场

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

(旁边private static final HashMap?!/旁边)。这是在这里
填充的。因此,共享相同上下文的应用程序中的所有线程(我在这里问过,但我仍然不是 100% 确定)将共享这个实例的静态映射 - 现在,每当你调用 edit() 时,你都会得到一个新的 EditorImpl 实例- 所以在您在问题中提到的“同步(this)” this指的是手头的 EditorImpl 的实例 - 它没有太多作用 - 它只是同步对 EditorImpl 的内部映射的访问。但是(不同的)编辑器在(commonSharedPreferencesImpl实例上进行同步,当他们要修改这个(SharedPreferencesImpl)实例时。所以在SharedPreferencesImplcommit()例如在同步开启commitToMemory()的地方被调用。请记住,尽管对磁盘的写入是以随机顺序排列的(请参阅 javadoc 中的 enqueueDiskWriteSo并注意在写入内存和排队写入磁盘之间没有锁定)。因此,只要您不依赖于修改顺序并且不依赖于原子检查设置首选项值(需要您自己同步),您应该可以安全地修改首选项 注意我引用的代码是针对 2.3.1_r1 -希望仍然有效 SharedPreferencesImpl.thiscommit

于 2013-05-03T21:28:43.633 回答