Java Reference
In-Depth Information
In diesem Fall vereinfacht sich der Rumpf der Methode getInstance() , da der
Vergleich entfällt und die Referenz auf das Singleton-Objekt sofort zurückgegeben
werden kann. Dadurch ist in diesem Beispiel die Methode getInstance() nicht mehr
durch einen Threadwechsel unterbrechbar und somit im Gegensatz zum vorherigen
Beispiel bereits threadsicher, d. h., die statische Methode getInstance() kann von
verschiedenen Threads aufgerufen werden. Die Performance leidet so nicht, allerdings
wird je nach verwendeter Programmiersprache unnötig Speicher verbraucht für den
Fall, dass das Singleton-Objekt nie gebraucht wird. Im Falle von Java wird die Klasse
wirklich nur dann geladen, wenn sie wirklich genutzt wird, also das Objekt gebraucht
wird. Dann wird automatisch auch das Objekt erstellt.
Vergleich der beiden Varianten
Es ist - wie so oft - zwischen Performance und Speicherbedarf abzuwägen und die
richtige Variante für die aktuell vorliegende Situation auszuwählen. Hat man nur einen
einzigen Thread und ist sich nicht sicher, ob das Singleton-Objekt überhaupt jemals
benötigt wird, so ist sicherlich die Variante 1 aus [Gam95] geeigneter. Sie verspricht
einen unter Umständen geringeren Speicherverbrauch, benötigt aber einen höheren
Rechenaufwand. Wenn die Lösung threadsicher sein soll und das Singleton-Objekt in
jedem Fall gebraucht wird, so ist die Variante 2 aus [Gr102] die bessere Lösung. Unter
den genannten Umständen fällt der Rechenaufwand für diese Variante geringer aus.
Diese Lösung kann sogar noch weiter optimiert werden: Wenn instance zu einer
öffentlichen Konstanten der Klasse Singleton gemacht wird, kann die Klassen-
methode getInstance() entfallen, da auf die öffentlichen Konstanten direkt zuge-
griffen werden kann.
Das zweite Beispiel ist threadsicher, d. h., es kann problemlos von mehreren Threads
aufgerufen werden, da das Singleton-Objekt bereits beim Laden der Klasse angelegt
wird. Dies soll durch den mehrmaligen Aufruf der Methode getInstance() in ver-
schiedenen Threads aufgezeigt werden:
// Datei: SingletonTestThread.java
public class SingletonTestThread extends Thread
{
public String threadName;
public SingletonTestThread (String tName)
{
threadName = tName;
}
public void run()
{
try
{
Thread.sleep (500);
System.out.println (threadName + " - call 1");
ToolTipManager2.getInstance().operation();
Thread.sleep (500);
System.out.println (threadName + " - call 2");
Search WWH ::




Custom Search