Stavo facendo qualche ricerca sui singleton, in particolare per quanto riguarda l'inizializzazione pigro vs bisognosa di singleton.Schema singleton con combinazione di caricamento lazy e sicurezza thread
Un esempio di inizializzazione ansioso:
public class Singleton
{
//initialzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}
ma come mostrato sopra che è pronto inizializzazione e sicurezza filo viene lasciata JVM ma ora, voglio avere questo stesso modello ma con inizializzazione ritardata.
quindi venire con questo approccio:
public final class Foo {
private static class FooLoader {
private static final Foo INSTANCE = new Foo();
}
private Foo() {
if (FooLoader.INSTANCE != null) {
throw new IllegalStateException("Already instantiated");
}
}
public static Foo getInstance() {
return FooLoader.INSTANCE;
}
}
Come mostrato sopra Poiché la linea
private static final Foo INSTANCE = new Foo();
viene eseguita solo quando il FooLoader classe viene effettivamente utilizzato, questo prende cura della istanziazione pigrizia , ed è garantito per essere thread-safe.
È corretto?
Duplicato http://stackoverflow.com/q/5842273/823393 – OldCurmudgeon
Questa non è un'inizializzazione davvero pigra? L'istanza può essere caricata prima che venga invocato il metodo 'getInstance'. – Perception
Questo è certamente pigro. L'istanza è solo istanziata al primo riferimento della classe. A cui verrà fatto riferimento solo nella prima invocazione di 'getInstance'. Anche se rimuoverei il controllo della creazione nel costruttore. –