IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Singleton en environnement Multithread


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 19
    Par défaut Singleton en environnement Multithread
    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 .

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Ca peut fonctionner... mais c'est lourd !

    La plupart du temps l'initialisation static est amplement suffisante et bien plus simple à mettre en place...


    a++

  3. #3
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 19
    Par défaut
    Merci pour ta réponse rapide. Je ne peux pas utiliser l'initialiseur static, car j'ai absolument besoin que l'objet soit construit au premier appel de la méthode getInstance et pas avant. J'ai donc le choix entre synchroniser toute la méthode ou faire ce DCL "amélioré" (je trouve personnellement la méthode du ThreadLocal trop complique).

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    et utiliser des apis comme commons discovery? Qui sont déjà prévue et conçues pour éviter ce problème

  5. #5
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 19
    Par défaut
    Je ne connais pas l'api commons discovery, je vais faire un tour sur le net pour en apprendre d'avantage. En tout cas merci pour ce pointeur.

    Sinon je pense que le code que tu as propose est plus simple que le mien et je pense qu'il devrait aussi fonctionner. Si ce n'est pas le cas quel est le problème ?

    Encore merci pour ton aide.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je l'ai retiré, mon code se faisait avoir comme un bleu: le out of order write

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Notons au passage que dans le code donné au départ, isCompleted n'est pas volatile.
    Par conséquent, si elle est false en entrant dans la boucle while, elle ne deviendra jamais true à l'intérieur de cette boucle, et la boucle ne finira pas.

    volatile permettrait à sa valeur de changer pendant la boucle, et avec les JVM modernes cela règlerait en effet le problème... Mais du coup, je ne vois pas ce que cela est censé faire de mieux qu'un DCL ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Notons au passage que dans le code donné au départ, isCompleted n'est pas volatile.
    Par conséquent, si elle est false en entrant dans la boucle while, elle ne deviendra jamais true à l'intérieur de cette boucle, et la boucle ne finira pas.
    Je ne suis pas certains que ce soit nécessaire dans ce cas ci. En effet, il y a un appel de méthode dans la boucle, la jvm n'a aucun moyen de savoir si cet appel ne change pas le champ de manière synchrone et donc est bien forcée de le relire depuis les champs de la classe.

    Par contre, ta réflexion aurait été totalement justifié si on avait eu une boucle active:

    Enfin, rappelons pour le fun que volatile peut être ignoré par la JVM

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alladdin Voir le message
    Merci pour ta réponse rapide. Je ne peux pas utiliser l'initialiseur static, car j'ai absolument besoin que l'objet soit construit au premier appel de la méthode getInstance et pas avant.
    Si getInstance() est l'unique élément static et que les constructeurs sont bien privés, alors ce sera bien le cas, à moins de charger la classe explicitement via un Class.forName("")...


    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compteurs en environnement multithread
    Par bartinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/08/2011, 11h38
  2. Réponses: 20
    Dernier message: 09/01/2011, 19h02
  3. Le singleton en environnement clusterisé
    Par FrenchFrogger dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 3
    Dernier message: 07/07/2009, 11h18
  4. Exercice : Environnement multithread
    Par cerby dans le forum C
    Réponses: 3
    Dernier message: 03/01/2008, 23h20
  5. lock de fichiers en environnement multithreadé
    Par Pi2 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 05/09/2007, 18h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo