Questa sincronizzazione è richiesta nel metodo onCreate di servizio?

2

Di seguito è riportato un codice di esempio che ho catturato da android doc

L'istanza di servizio onCreate verrà chiamata una sola volta. Rif: qui e qui

La sincronizzazione e il singleton non hanno alcun senso per me in questa circostanza. Molto recentemente ho fatto un'altra domanda su google document qui

Se questo è ancora sbagliato, probabilmente ho bisogno di limitarmi a prendere le convenzioni di chiamata dai loro documenti e ignorare la loro logica.

Ci scusiamo per l'esecuzione di Google doc con la community in rapida successione. Voglio solo correggermi su quanto dovrei prendere da questi documenti.

public class SyncService extends Service {
    // Storage for an instance of the sync adapter
    private static SyncAdapter sSyncAdapter = null;
    // Object to use as a thread-safe lock
    private static final Object sSyncAdapterLock = new Object();
    /*
     * Instantiate the sync adapter object.
     */
    @Override
    public void onCreate() {
        /*
         * Create the sync adapter as a singleton.
         * Set the sync adapter as syncable
         * Disallow parallel syncs
         */
        synchronized (sSyncAdapterLock) {
            if (sSyncAdapter == null) {
                sSyncAdapter = new SyncAdapter(getApplicationContext(), true);
            }
        }
    }
    
posta Saran 22.09.2014 - 09:23
fonte

1 risposta

1

È necessario. Nota che sSyncAdapter è una variabile STATIC.

Questo significa che ce n'è uno per applicazione, non uno per istanza dell'oggetto.

Considerare la situazione quando vengono creati 2 (o più) oggetti SyncService allo stesso tempo. In quel caso, ci sarebbe una gara e si potrebbero ottenere due oggetti SyncAdapter creati (con un riferimento ciondolante non assegnato a sSyncAdapter).

E - anche se la logica esterna dell'applicazione impedisce di creare due SyncService contemporaneamente, c'è un altro motivo per il blocco. Crea una barriera di memoria, che "pubblica" l'assegnazione a sSyncAdapter ad altri thread. Presumo che ci sia un altro codice (threaded) che accede a sSyncAdapter. Il blocco / sblocco è necessario per forzare la gestione della cache del processore a svuotare i dati in modo che siano visti da altri thread.

    
risposta data 18.07.2018 - 00:41
fonte

Leggi altre domande sui tag