Artykuł Wikipedii na temat Singletons wspomina o kilku wątkowych bezpiecznych sposobach implementacji struktury w Javie. Jeśli chodzi o moje pytania, zastanówmy się nad Singletonami, które mają długie procedury inicjalizacji i są dostępne dla wielu wątków naraz.Wątek bezpieczny Singletons w Javie
Po pierwsze, czy ta niewymieniona metoda jest bezpieczna dla wątków, a jeśli tak, z czym synchronizuje?
public class Singleton {
private Singleton instance;
private Singleton() {
//lots of initialization code
}
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
Po drugie, dlaczego poniższy wątek implementacji jest bezpieczny I leniwy w inicjalizacji? Co dokładnie dzieje się, gdy dwa wątki wprowadzają jednocześnie metodę getInstance()
?
public class Singleton {
private Singleton() {
//lots of initialization code
}
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
Wreszcie, w drugim przykładzie, co jeśli jeden wątek dostaje instancji pierwszy i inny wątek dostaje instancję i próbuje wykonywać działania na niego przed konstruktor zakończy się w pierwszym wątku? Czy możesz wtedy wejść w stan niebezpieczny?
Po przeczytaniu tego artykułu, czy mam rację mówiąc, że Java wykonuje "wewnętrzną" synchronizację podczas ładowania pól statycznych? – donnyton
_ "Ten wzorzec jest wzorcem do użycia w przypadku singletonów." _ - a co z [Effective Java's enum singleton] (http://stackoverflow.com/questions/427902/java-enum-singleton)? –
IMHO enum singleton nie jest tak czysty i oczywisty jak ten, a zatem nie jest tak dobry: 'MyClass.getInstance()' jest standardem branżowym dla singletonów - każdy, kto używa go automatycznie (powinien) wie, że ma do czynienia z singleton. Ten wzór ma właściwe API * i * właściwą implementację pod maską. – Bohemian