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 :

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;				
	}
}
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() ?).


Merci d'avance pour vos réponses .