Édition: J'ai découvert que le constructeur du singleton est appelé plusieurs fois, de sorte qu'il semble que les classes soient chargées plus d'une fois par des chargeurs de classe distincts. Comment puis-je faire un singleton global dans Tomcat? J'ai été googling, mais pas de chance jusqu'à présent.Accès à une variable globale dans un serveur Tomcat multithread
J'ai un objet singleton que je construis comme ainsi:
private static volatile KeyMapper mapper = null;
public static KeyMapper getMapper()
{
if(mapper == null)
{
synchronized(Utils.class)
{
if(mapper == null)
{
mapper = new LocalMemoryMapper();
}
}
}
return mapper;
}
La Miniclip de classe est essentiellement un wrapper synchronisé à hashmap avec seulement deux fonctions, l'un pour ajouter un mappage et l'autre pour supprimer une correspondance. Lors de l'exécution de Tomcat 6.24 sur mon ordinateur Windows 32 bits tout fonctionne bien. Cependant, lors de l'exécution sur une machine Linux 64 bits (CentOS 5.4 avec OpenJDK 1.6.0-b09), j'ajoute un mappage et j'imprime la taille de la HashMap utilisée par KeyMapper pour vérifier que le mappage a été ajouté (c'est-à-dire verify size = 1). Ensuite, j'essaie de récupérer le mapping avec une autre requête et je continue à obtenir null et quand j'ai vérifié la taille de la HashMap c'était 0. Je suis confiant que le mapping n'est pas accidentellement enlevé puisque j'ai commenté tous les appels à enlever (et je n'utilise pas clair ou d'autres mutateurs, juste obtenir et mettre). Les demandes passent par Tomcat 6.24 (configuré pour utiliser 200 threads avec un minimum de 4 threads) et j'ai passé -Xnoclassgc au jvm pour m'assurer que la classe ne récupère pas les ordures par inadvertance (jvm est également en cours d'exécution - mode serveur). J'ai également ajouté une méthode de finalisation à KeyMapper pour imprimer sur stderr si jamais elle était collectée pour vérifier qu'elle n'était pas collectée.
Je suis à mon esprit fin et je ne peux pas comprendre pourquoi une minute, l'entrée dans HashMap est là et la suivante il n'est pas :(
Je pense que votre bug est ailleurs. –