查看SharedPreferences docs它说:



因此,它本身似乎并不是线程安全的。但是,对commit()和apply()做出什么样的保证?

例如:

synchronized(uniqueIdLock){
   uniqueId = sharedPreferences.getInt("UNIQUE_INCREMENTING_ID", 0);
   uniqueId++;
   sharedPreferences.edit().putInt("UNIQUE_INCREMENTING_ID", uniqueId).commit();
}

在这种情况下,可以保证uniqueId始终是唯一的吗?

如果不是,是否存在更好的方法来跟踪持久存在的应用程序的唯一ID?

最佳答案

进程和线程是不同的。 Android中的SharedPreferences实现是线程安全的,但不是进程安全的。通常,您的应用程序将在同一进程中全部运行,但是您可以在AndroidManifest.xml中对其进行配置,因此,例如,该服务在与 Activity 不同的单独进程中运行。

要验证线程安全性,请参阅AOSP中的ContextImpl.java的SharedPreferenceImpl。请注意,无论您希望在哪里同步,都有一个同步。

private static final class SharedPreferencesImpl implements SharedPreferences {
...
    public String getString(String key, String defValue) {
        synchronized (this) {
            String v = (String)mMap.get(key);
            return v != null ? v : defValue;
        }
   }
...
    public final class EditorImpl implements Editor {
        public Editor putString(String key, String value) {
            synchronized (this) {
                mModified.put(key, value);
                return this;
            }
        }
    ...
    }
}

但是,对于您唯一ID的情况,您似乎仍然希望保持同步,因为您不希望它在get和put之间进行更改。

08-26 06:44