Bonjour,
J'ai lu ce tutoriel sur le singleton en environnement multithread : http://christophej.developpez.com/tu...n/multithread/
Dedans on trouve notamment l'explication du pourquoi le DCL ne marche pas (possibilite d'avoir un objet partiellement initialise). Je pense avoir trouve une solution a ce problème et je voudrais avoir votre avis concernant cette solution.
L'idée est de rajouter , au niveau de la classe, un boolean (isCompleted) pour savoir si l'exécution du constructeur est fini ou non. Si le constructeur a fini, on retourne l'objet sinon on attend. Voici un code descriptif :
A votre avis est ce que cette méthode marche ou pas ? Si oui qu'en pensez vous de manière général (meilleur que synchroniser toute la méthode getInstance() ?).
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
21
22
23
24
25 import java.util.* ; class Singleton{ private static Singleton instance; private List maList; private static boolean isCompleted = false; private Singleton(){ maList= new ArrayList(); } public static Singleton getInstance(){ if (instance==null){ synchronized (Singleton.class){ if(instance==null){ instance=new Singleton(); isCompleted = true; } } } else{ while(!isCompleted){ wait(2000); //ajouter le try catch block. 2000 est un exemple mettre le temps approximatif de construction de l'objet } } return instance; } }
Merci d'avance pour vos réponses .
Partager