Voilà, dans le cadre de mon stage je reprend du code existant tournant sous Jboss 5.
Il y a une classe singleton nommée MultithreadedEngine.java (n'est pas encore multi-threads, malgré son nom).

Elle est initialisée de cette façon:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private static MultithreadedEngine   instance   = new MultithreadedEngine();
 
.....
 
private MultithreadedEngine()
    {
        this.dictionary = new InternalDictionary();
 
        this.scheduler  = new InternalScheduler(dictionary);
 
        this.acquisitionAndProcessing = new AcquisitionAndProcessingImpl(this.dictionary,this.scheduler);
        this.configuration = new ConfigurationImpl(this.dictionary,this.scheduler);
        this.loader = new InternalLoader(this.dictionary,this.scheduler);
        //this.importExport = new ImportExportImpl(this.dictionary);        
    }
 
    public static MultithreadedEngine getInstance()
    {
        return instance;
    }
A ce que j'ai compris le programme contient un peu de multithreading (mais pas cette classe).
Si j'en juge par ce qui est dit dans ce tuto: http://christophej.developpez.com/tu...n/multithread/
la façon dont le singleton MultithreadedEngine est créée est sûr: je ne devrais avoir qu'une seule instance de cette classe, même dans un environnement multi-threads.

Mais .... le problème c'est que j'ai deux instances de cette classe.
En effet j'utilise cette classe dans des EJB. Exemple:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@PostConstruct
    public void init()
    {
        try
        {
        	this.runtimeManager = MultithreadedEngine.getInstance().getConfigurator();
            this.scheduler = MultithreadedEngine.getInstance().getScheduler();
 
            LoggerImpl.getInstance().debug(sessionBeanName + " Bean Initialized.");
        }
        catch (Exception e)
        {
            LoggerImpl.getInstance().fatal(sessionBeanName + " Error during initilizing the context.");
            ThrowableExplorer.print(e);
        }
    }
Quand par exemple je lance un test Junit, je fais un loockup sur un ejb: l'instance du singleton est créée.
Puis, dans le même test j'appelle MultithreadedEngine.getInstance(): une autre instance est créée. Si j'appelle à nouveau l'instance MultithreadedEngine.getInstance() ou l'instance qu'il y a dans les ejb il n'y a pas de nouvelles instance de créées, les références que j'obtient sont vers chacune des deux instances créés.

Je suis sûr que ce sont deux instances différentes: leurs adresses sont différentes, et j'ai fait divers tests pour m'assurer qu'il s'agissait bien de deux instances différentes.

Pour résumer, il y a deux instances du singleton: une pour les ejb, une pour les autres classes.

Est-ce que c'est une histoire de jvm? Sous Jboss, en utilisant les ejb, est-ce qu'il y a toujours qu'une seule jvm (j'utilise pas de clustering pour l'instant)? Ca n'a pas l'air de venir d'un problème de threads en tous cas.