Preferencias compartidas y seguridad de subprocesos

Al mirar los documentos de SharedPreferences dice:

“Nota: actualmente esta clase no admite el uso en múltiples procesos. Esto se agregará más tarde”.

Por lo tanto, en sí mismo no parece ser Thread Safe. Sin embargo, ¿qué tipo de garantías se hacen con respecto a commit () y apply ()?

Por ejemplo:

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

¿Se garantizaría que el ID único siempre fue único en este caso?

De lo contrario, ¿existe una mejor manera de realizar un seguimiento de una identificación única para una aplicación que persiste?

    Los procesos y los hilos son diferentes. La implementación de SharedPreferences en Android es segura para subprocesos pero no es segura para el proceso. Normalmente, su aplicación se ejecutará todo en el mismo proceso, pero es posible configurarla en AndroidManifest.xml para que, por ejemplo, el servicio se ejecute en un proceso diferente de, por ejemplo, la actividad.

    Para verificar la seguridad de los elementos filiformes, consulte el SharedPreferenceImpl de ContextImpl.java de AOSP. Tenga en cuenta que hay un sincronizado donde sea que espere que haya uno.

     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; } } ... } } 

    Sin embargo, para su caso de identificación única, parece que todavía desea una sincronización ya que no desea que cambie entre el get y el put.

    Me preguntaba lo mismo, y encontré este hilo que dice que no son seguros para subprocesos:

    Las implementaciones de Context.getSharedPreferences () y Editor.commit () no se sincronizan en el mismo monitor.


    Desde entonces he consultado el código de Android 14 para verificarlo, y está bastante involucrado. Específicamente, SharedPreferencesImpl parece usar lockings diferentes al leer y escribir en el disco:

    • enqueueDiskWrite() bloquea en mWritingToDiskLock
    • startLoadFromDisk() bloquea this y lanza un locking de subprocesos en SharedPreferencesImpl.this

    No estoy convencido de que este código sea realmente seguro.

    Debe tener en cuenta que las Preferencias Compartidas no funcionan en los teléfonos Samsung, eche un vistazo al problema de Android .

    Implementé almacenamiento simple de preferencias de base de datos que puedes encontrar en github .

    Aclamaciones,

    Creo que eso lo hará.

    Puedes probarlo usando el modo de suspensión dentro de la sección sincronizada y llamarlo desde diferentes hilos