Bearbeiten: Ich habe herausgefunden, dass der Konstruktor für das Singleton mehrmals aufgerufen wird, sodass anscheinend die Klassen mehrmals von separaten Klassenladern geladen werden. Wie kann ich ein globales Singleton in Tomcat erstellen? Ich habe gegoogelt, aber bisher kein Glück gehabt.
Ich habe ein Singleton-Objekt, das ich folgendermaßen konstruiere:
private static volatile KeyMapper mapper = null;
public static KeyMapper getMapper()
{
if(mapper == null)
{
synchronized(Utils.class)
{
if(mapper == null)
{
mapper = new LocalMemoryMapper();
}
}
}
return mapper;
}
Die Klasse KeyMapper ist im Grunde eine synchronisierte Hülle für HashMap mit nur zwei Funktionen, eine zum Hinzufügen einer Zuordnung und eine zum Entfernen einer Zuordnung. Wenn ich auf meinem 32-Bit-Windows-Computer unter Tomcat 6.24 laufe, funktioniert alles gut. Wenn ich jedoch auf einem 64-Bit-Linux-Computer (CentOS 5.4 mit OpenJDK 1.6.0-b09) laufe, füge ich eine Zuordnung hinzu und drucke die Größe der von KeyMapper verwendeten HashMap, um zu bestätigen, dass die Zuordnung hinzugefügt wurde (d.h. bestätigen Größe = 1). Dann versuche ich, die Zuordnung mit einer anderen Anfrage abzurufen, und ich erhalte immer null und als ich die Größe der HashMap überprüfte, war sie 0. Ich bin zuversichtlich, dass die Zuordnung nicht versehentlich entfernt wird, da ich alle Aufrufe von remove auskommentiert habe (und ich verwende weder clear noch andere Veränderer, nur get und put).
Die Anfragen werden über Tomcat 6.24 (konfiguriert für die Verwendung von 200 Threads mit mindestens 4 Threads) durchgeführt und ich habe -Xnoclassgc an die JVM übergeben, um sicherzustellen, dass die Klasse nicht versehentlich vom Garbage Collector eingesammelt wird (die JVM läuft auch im -server-Modus). Ich habe auch eine finalize Methode zu KeyMapper hinzugefügt, um zu drucken, wenn es jemals vom Garbage Collector eingesammelt wird, um zu bestätigen, dass dies nicht der Fall war.
Ich bin mit meinem Latein am Ende und kann nicht verstehen, warum einmal der Eintrag in der HashMap vorhanden ist und dann nicht mehr :(