Divad
2009-02-16 13:51:21 UTC
Hallo zusammen,
ich bin auf mehreren Seiten darauf gestoßen, dass bei der Erzeugung von Lazy
Creation-Singletons die Performance-Einbußen durch die dauernde Synchronisation
von Threads in Java nicht zu umgehen sei.
Allerdings stellt sich mir die Frage, warum dies nicht wie folgt klappen soll:
/* Die einzige Instanz */
private static LazyCreationSingleton LC_INSTANCE;
/* Original-Initialisierung mit Performanceeinbuße */
public synchronized static LazyCreationSingleton getInstance() {
if (LC_INSTANCE == null) {
LC_INSTANCE = new LazyCreationSingleton();
}
return LC_INSTANCE;
}
/* Nun die Änderungen */
private static boolean isInit = false;
private synchronized static LazyCreationSingleton initialize() {
if (LC_INSTANCE == null) {
LC_INSTANCE = new LazyCreationSingleton();
isInit = true;
}
return LC_INSTANCE;
}
public static LazyCreationSingleton getInstance() {
return (isInit) ? LC_INSTANCE : initialize();
}
Ich habe es oberflächlich getestet und da führte es zu keinen Exceptions.
Solange isInit false liefert, rufen alle Threads die synchronisierte Methode
initialize() auf. Sobald true, kann die Einzel-Instanz direkt zurückgegeben
werden.
Falls vorhanden, wo liegt die Zwickmühle?
ich bin auf mehreren Seiten darauf gestoßen, dass bei der Erzeugung von Lazy
Creation-Singletons die Performance-Einbußen durch die dauernde Synchronisation
von Threads in Java nicht zu umgehen sei.
Allerdings stellt sich mir die Frage, warum dies nicht wie folgt klappen soll:
/* Die einzige Instanz */
private static LazyCreationSingleton LC_INSTANCE;
/* Original-Initialisierung mit Performanceeinbuße */
public synchronized static LazyCreationSingleton getInstance() {
if (LC_INSTANCE == null) {
LC_INSTANCE = new LazyCreationSingleton();
}
return LC_INSTANCE;
}
/* Nun die Änderungen */
private static boolean isInit = false;
private synchronized static LazyCreationSingleton initialize() {
if (LC_INSTANCE == null) {
LC_INSTANCE = new LazyCreationSingleton();
isInit = true;
}
return LC_INSTANCE;
}
public static LazyCreationSingleton getInstance() {
return (isInit) ? LC_INSTANCE : initialize();
}
Ich habe es oberflächlich getestet und da führte es zu keinen Exceptions.
Solange isInit false liefert, rufen alle Threads die synchronisierte Methode
initialize() auf. Sobald true, kann die Einzel-Instanz direkt zurückgegeben
werden.
Falls vorhanden, wo liegt die Zwickmühle?