Singleton?

Hallo Tom,
stimmt, fällt mir auch gerade auf wo du es sagst. Allerdings nehmen wir mal an, wir hätten viele Singletons, die vielleicht zu sehr unterschiedlichen Zeiten das erste Mal benötigt werden und die eine sagen wir mal größere Anlaufphase wegen Initialisierung benötigen würden, weil sie z.B. auf Daten einer DB zugreifen würden ..., dann würde ein initialiseren schon beim Klassenladen möglicherweise für den Anwender störend, so man es besser auf die Zeit verteieln sollte, also immer dann wenn es beim erstenmal benötigt wird.
Ich denke man müsste für solche Fälle einem
Code:
sychronize
den Vorzug geben, oder wie siehst Du das?
Oder man sieht zu das Initialisierungen immer von einem Thread laufen.
Ist natürlich alles Anwendungsfallfrage.
Aber Deinen Einwand finde ich durchaus gut und wichtig.

Takidoso
 
Hi Tom,
der Artikel ist echt sehr interssant wie aufschlussreich. Also ein normaler synchronize würde demnach erwrtungsvoll funktionieren, jedoch natürlich mit den damit verbundenen Kosten pro aufruf. Und an diesen Kosten kann man offenbar selbst mit den dort dargestellten Tricks, die dort ebenfalls widerlegt wurden, nicht unterbinden.
Andererseits bleibt für mich die Frage ob denn die Kosten so wild sind. Solange das nicht in einer oft iterierten Schleife passiert, halte ich es insgesammt vernachlässigbar. Und natürlich, wenn man keine initialisierung phasen aufteilen braucht, weil die Singletons sich schnell genug, also für einen Anwender bei einer Gui-Anwendung nicht stören bzw auffallen, ist ein sofortiges initialsieren in der Variablen-Deklaration absolut kein Hemmschuh.

Takidoso
 
Hi,

erstmal danke an Tom - wieder was dazugelernt.

@takidoso: Vorneweg möchte ich sagen, dass dies hier keine Kritik an deiner Person sein soll, als eher die Kritik an schlecht lesbaren Texten ist. Du magst mir - evtl auch anderen - verzeihen wenn ich sage, dass es mir sehr viel Mühe bereitet deine langatmigen Texte zu lesen. ;)

Gruß

Romsl
 
Hallo,

also soviel hab ich nun von den vielen Beiträgen verstanden:

Fazit:

Da es von einer Singletonklasse nur eine Instanz geben kann, macht es keinen wesentlichen Unterschied ob ich diese jedesmal mit getInstance oder mit einer Referenzvariablen aufrufe.
Zweitens sollte man vielleicht das Referenzieren vieler Singleton Klassen auf einmal vermeiden, da es dann zu Verlängerung der Startzeit kommen kann. Besser die verschiedenen Singeltoninstanzen nach Bedarf nach und nach instanzieren.

So sieht ein sicherer Multithreadsingleton aus.

Code:
private static FooBar INSTANCE = new FooBar();

public static FooBar getInstance() {
    return INSTANCE;
}

Allerdings, hat dies auch den Nachteil das die Klassen sofort bei Programmstart instanziert werden.



Vg Erdal
 
Ich finde es macht schon einen Unterschied, ob ich nun eine Referenz aufrufe oder vorher immer noch getInstance(). Jeder Aufruf einer Methode kostet und da eine Referenz sehr wenig benoetigt ist es meiner Meinung nach nicht sinnvoll jedesmal wieder die getInstance() aufzurufen.
 
Zurück