查看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之间进行更改。