2015-05-14 31 views
6

Sto cercando di spostare tutto nella mia app lontano dai singleton, perché sono stato reso consapevole che si tratta di una cattiva pratica di programmazione, con ciò detto, sto cercando di implementare l'iniezione delle dipendenze di Dagger 2. E mi chiedo, quando fai @Singleton in Dagger 2 quel thread è sincronizzato? se no, come posso sincronizzarlo, quindi non capisco anomalie di dati strani da più thread che toccano le stesse cose.è @Singleton in Dagger 2 thread safe?

Quando stavo creando singletons prima avrei fatto qualcosa di simile:

public class SomeSinglton { 
    private static ClassName sInstance; 

    private SomeSinglton() { 
    } 

    public static synchronized ClassName getInstance() { 
     if (sInstance == null) { 
      sInstance = new ClassName(); 
     } 
     return sInstance; 
    } 

è l'equivalente Dagger 2 @Singleton quanto viene sincronizzato?

+0

sei sicuro che il metodo deve essere sincronizzato e non sIntance? Forse ho sbagliato, ma sulla base della mia esperienza direi che la sincronizzazione non è nel posto giusto, ma se ho torto, voglio sapere perché –

risposta

0

Come menzionato da Artem Zinnatullin nella sua risposta, la creazione di istanza delle classi @Singleton è sicura in Dagger.

Ma se hai intenzione di toccare quel singleton da diversi punti devi renderlo sicuro da solo. Altrimenti, Dagger non ti aiuterà.

In genere, l'annotazione @Singleton dovrebbe significare per altri sviluppatori che tale classe può essere utilizzata da thread diversi.

+0

Grazie. è qualcosa che dovrei implementare nel modulo o nella classe che il modulo sta generando? –

+0

Questo dovrebbe essere correlato direttamente alla classe. Vi consiglio di leggere qualcosa sulla concorrenza di Java e su come creare un codice thread-safe. Sincronizzare un'intera classe è solitamente una cattiva idea. – Ayzen

+0

grazie mille. –

-1

Bottino a this site. Esistono diversi approcci per implementare Singleton, tra cui ThreadSafeSingleton

+0

Questo dovrebbe essere un commento. Oltre al link, non fornisce una risposta vera alla domanda. –

0

Non c'è niente di sbagliato nei singleton. Ma questa è l'implementazione migliore.

public class SomeSinglton { 
    private static ClassName sInstance = new SomeSinglton(); 

    private SomeSinglton() { 
    } 

    public static ClassName getInstance() { 
     return sInstance; 
    } 

C'è una sincronizzazione implicita quando il campo statico sInstance è initalized.

+0

Non penso che questo risponda alla mia domanda ... Mi riferisco all'iniezione di dipendenza con la libreria di Dagger 2. E ora ho letto in troppi posti che i singleton sono cattivi ... sono cattivi perché sono molto difficili da Unite Test e perché accoppiano strettamente i componenti. Inoltre sono abbastanza sicuro che il tuo codice in questo esempio non sia thread-safe. Non è sincronizzato Penso che causerebbe molti problemi in un'app multithread. –

+0

Scommetto che la libreria l'ha implementata correttamente. E ti assicuro che il mio impl è corretto e * meglio * :) fidati di me. – ZhongYu

+0

Per quanto riguarda se i singleton sono cattivi, hai mai avuto problemi con i tuoi singleton? Un'opinione non diventa più corretta se ripetuta un milione di volte; sfortunatamente ciò accade molto nel nostro settore. – ZhongYu

5

Sì, @Singleton s in Dagger 2 sono thread-safe con doppio blocco controllato, lo stesso in Dagger 1. Vedere ScopedProvider.