Il pattern singleton è incline a presentare problemi di sicurezza?

3

Lo schema singleton è incline a presentare problemi di sicurezza? Se sì, quali sono i metodi migliori per aggirarli?

    
posta DeveloperDon 14.09.2012 - 21:46
fonte

4 risposte

1

È heavily depend on the programming language specification & how thread safety is you implemented.

Ad esempio: il codice fornito di seguito utilizza il blocco a doppio controllo, che non dovrebbe essere utilizzato prima di J2SE 5.0, in quanto è vulnerabile a bug sottili.

public class Singleton {
        private static volatile Singleton instance = null;

        private Singleton() {   }

        public static Singleton getInstance() {
                if (instance == null) {
                        synchronized (Singleton.class){
                                if (instance == null) {
                                        instance = new Singleton();
                                }
                      }
                }
                return instance;
        }
}

Questo è un articolo di riferimento su come implementare correttamente Pattern Singleton in C # sicuro .     

risposta data 14.09.2012 - 21:49
fonte
7

Se ben implementato, con il threading in mente, un singleton sarà thread-safe.

Ci sono molte implementazioni in molte lingue che non sono thread-safe - leggi questo articolo di Jon Skeet riguardante Singleton in C # . La maggior parte delle implementazioni soffre.

Il modo migliore per "aggirarli" è conoscere la tua lingua, come funziona con i thread e assicurarti che il codice sia sicuro per i thread.

Solo per notare - anche se singleton erano in qualche modo thread safe per natura, non dovresti usarli per questo motivo. Tendono ad essere abusati e rendono il codice non verificabile come una fonte di stato globale.

    
risposta data 14.09.2012 - 21:50
fonte
2

Sì, come hanno notato altre risposte, può essere implementato in modo thread-safe. Detto questo, tende a essere soggetto a problemi poiché richiede già un'attenta implementazione per evitare problemi sottili dovuti all'ordine di inizializzazione. La possibilità di accesso a thread multipli esacerba queste preoccupazioni.

Ed è ancora lo stato globale. Anche se il singleton stesso è thread-safe, la dipendenza dallo stato globale tende ad aggiungere errori al codice multithread effettivo.

    
risposta data 14.09.2012 - 21:57
fonte
0

Il modo migliore per evitare problemi di sicurezza dei thread con un singleton non li usa. MrGreen Detto questo, se hai intenzione di usarli, indipendentemente dal fatto che siano sicuri o meno in una forma ingenua, dipende molto dalla lingua. Se c'è un problema di sicurezza, si trova nella pigra natura di inizializzazione dei singleton che potrebbe finire per essere eseguita in parallelo.

A parte questo, diciamo che stai lavorando in una lingua in cui è non thread-safe. Questo è stato il mio caso negli anni '90 con una base di codice C che è stata migrata in C ++, dove gli sviluppatori hanno iniziato a sentirsi felici con i modelli di progettazione, compresi i singleton. L'unica cosa che ti chiederei di fare qui per ottenere la sicurezza dei thread è iniziare a provare a fare cose fantasiose come il blocco a doppio controllo. Invece di fare backflip e motoseghe da giocoliere, c'è una soluzione molto semplice al problema se insisti a usare i singleton:

Just make sure the singleton is initialized in the main thread prior to it being accessed in others.

Questo è tutto. È una soluzione così semplice e non è un grosso problema da applicare. Non è necessario trovare un modo per indurre il mal di testa ad accedere al singleton senza incorrere nel sovraccarico del blocco nel caso comune. Assicurati che sia inizializzato nel thread principale prima che altri thread possano accedervi. Fatto. Ora puoi disattivare la funzione di accesso e andare avanti con la tua vita.

    
risposta data 13.12.2017 - 23:49
fonte

Leggi altre domande sui tag