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:
A ce que j'ai compris le programme contient un peu de multithreading (mais pas cette classe).
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; }
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:
Quand par exemple je lance un test Junit, je fais un loockup sur un ejb: l'instance du singleton est créée.
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); } }
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.
Partager