Mam wielowątkowych aplikacji i singleton Klasa:Threadsafe Singleton bez synchronizacji w Javie?
public final class Singleton {
private static MyClass mc;
public static final Object getInstance() {
if(mc == null) {
mc = new MyClass();
}
return mc;
}
}
Oczywiście, to nie będzie działać w ogólnym wielowątkowym scenariuszu. Ale rozważmy następujący scenariusz:
- Na początku jest tylko jedna nitka
- nazywa ten jeden wątek
getInstance()
po raz pierwszy tak że MC jest inicjowany. - Po wszystkie inne wątki są uruchamiane przez pierwszy wątek.
Moje założenie:
To powinno działać, ponieważ inicjalizacji pola mc
i konstrukcji obiektu zdarzyć, zanim wszystkie kolejne Thread.start()
połączeń, które uruchamiają inne wątki. I stanie się Thread.start()
dla wątku - przed wszystkimi innymi działaniami tego wątku. Wynika z tego, że inicjalizacja mc
ma miejsce - przed wszystkimi działaniami we wszystkich pozostałych wątkach, aby getInstance()
zwrócił prawidłową wartość dla wszystkich wątków.
Czy to założenie jest prawidłowe? Dlaczego? Dlaczego nie?
Cóż, @StephenC, lub POWINIENEM spytać ludzi, którzy (miejmy nadzieję) zrozumieją JMM, a tym samym WYZNACZĄ je mnie. – MinecraftShamrock
Wszystko będzie dobrze. Nazywa się "chętną inicjalizacją" (w zasadzie, chociaż twoja forma jest trochę inna, to w końcu to, co robisz). Wygoogluj to. Zobacz także http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-with-examples#eager-initialization –
Tak, działa, ale jest bardzo delikatny, jak możesz sobie wyobrazić. A koszt robienia tego dobrze, pod względem wydajności, jest znikomy. – assylias