# Singleton in WebApp!



## Jockel (9. Apr 2006)

Moin Moin!
Ich habe hier eine WebApplikation, die mit Struts entwickelt wurde und die unter anderem Gebrauch von einer Klasse macht, die als Singleton implementiert wurde. Das Ganze läuft auf einem Tomcat-Server. Singletons sind ja bei WebApplikationen, die häufig neu geladen werden, keine gute Idee, da diese ja nicht freigegeben werden können und ich irgendwann eine OutOfMemory-Exception erhalte.
Wenn ich mir also die Informationen hier http://wiki.apache.org/tomcat/OutOfMemory durchlese, ist das aber nur ein Problem wenn die Applikation häufig neu gestartet wird oder neu kompiliert wird.
Vorausgesetzt, dass bei Änderungen der Applikation (sprich, es muss neu kompiliert werden), der Server neu gestartet werden kann und in der Regel keine Reloads durchgeführt werden, könnte mir diese Singleton-Klasse immer noch irgendwie Probleme machen oder kann ich diese, unter den gegebenen Vorausetzungen, getrost so belassen? (habe nämlich keine Lust, großartig da noch was umzustricken, wenn es nicht unbedingt sein muss).


----------



## André Uhres (10. Apr 2006)

Jockel hat gesagt.:
			
		

> ..Singletons..da diese ja nicht freigegeben werden können..


Wenn du willst, daß der Garbage Collector deine nicht mehr benutzten Singletons wegräumen kann, 
dann könntest du dich an folgendes Muster halten:

```
//package schnipsel2;
/*
 * MeinSingleton.java
 *
 * Wenn das Singleton nicht mehr benutzt wird, 
 * sollte der Garbage Collector es freigeben können.
 */
import java.lang.ref.*;
public class MeinSingleton {
    private static Reference<MeinSingleton> meineReferenz;
    private MeinSingleton(){}
    public static synchronized MeinSingleton getInstance( ){
        MeinSingleton meinSingleton = null;
        if(meineReferenz != null){
            meinSingleton = meineReferenz.get();
        }
        if(meinSingleton == null){
            meinSingleton = new MeinSingleton(); 
            //Durch die WeakReference wird das Singleton
            //nicht im Speicher festgenagelt:
            meineReferenz = new WeakReference<MeinSingleton>(meinSingleton);
        }
        return meinSingleton;
    }
}
```


----------



## Jockel (11. Apr 2006)

Das sieht doch gut aus... nur leider hatte ich noch keine Zeit, dass zu testen. Man dankt schonmal.

[edit]
Scheint wunderbar zu funktionieren. Nochmals herzlichen Dank.


----------

