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

Concurrence et multi-thread Java Discussion :

[ Singleton ] Threads


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 229
    Par défaut [ Singleton ] Threads
    Bonjour,

    J'ai le Singleton suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Singleton avec champ final
    public class Singleton1 {
    	private static final Singleton1 INSTANCE= new Singleton1();
    	Private Singleton1 () { ---- }
    Comment éviter la création de plusieurs objets dans le cas de Multithreading. Si deux Thread accède au singleton en meme temps, comment éviter qu'il soit instancié deux fois?





    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Par défaut
    Ce que tu écris me semble convenir, même en environnement multi-threadé.
    Pour éviter le problème d'accès simultané à la méthode getInstance() d'un singleton (ce qui pourrait poser problème si l'instanciation se faisait dans cette méthode), on peut écrire un truc dans le genre :
    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
     
    public class MonSingletonAMoi {
     
         // l'instance unique est créée au chargement de la classe dans la JVM  donc pas de     
         // soucis même si plusieurs thread appellent la méthode getInstance() en même temps
         private static final MonSingletonAMoi instance = new MonSingletonAMoi();
     
         // le constructeur privé pour empêcher les instanciations "manuelles"
         private MonSingletonAMoi() {}
     
         // retourne l'instance unique de la classe MonSingletonAMoi et on est sur qu'avant l'appel
         // à cette méthode, l'instance existe déjà. Donc on a bien une seule instance dans une JVM
         public static MonSingletonAMoi getInstance() {
             return instance;
         }
     }
    Ça me parait être une bonne méthode.

  3. #3
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour,
    Citation Envoyé par hocinema Voir le message
    Comment éviter la création de plusieurs objets dans le cas de Multithreading. Si deux Thread accède au singleton en meme temps, comment éviter qu'il soit instancié deux fois?
    Aucun risque: le champ INSTANCE est statique, il est donc initilisé au chargement de la classe, ce qui ne se fait qu'une seule fois.

    Une autre technique serait l'approche différée, où on ne crée le singleton que la première fois qu'il est demandé, donc dans la méthode getInstance(). Seulement, faut faire attention à marquer cette méthode comme synchronized.

  4. #4
    Membre très actif
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Par défaut
    faut faire attention à marquer cette méthode comme synchronized
    Légèrement dangereux en multithreading si on s'y prends mal (ç peux ralentir pas mal le programme voire le rendre assimilable à un monothread), pour ceux qui ont du mal avec le mot synchronized, essayez d'appeler une fois la méthode getInstance() avant de lancer vos threads.

  5. #5
    Membre Expert

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Par défaut
    La création d'un singleton en multi-threadé est assez touchy en java. La solution du synchronized est sympa mais bien couteuse si on fait beaucoup d'accès. L'autre solution c'est d'utiliser un ThreadLocal().

    Tout est décrit ici: http://christophej.developpez.com/tu...n/multithread/

    Il y est expliqué aussi pourquoi le très connu double check locking est erroné.

Discussions similaires

  1. singleton thread safe
    Par r0d dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 19/12/2012, 08h26
  2. [singleton][thread]accès aux methodes
    Par philippe13 dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 24/10/2008, 11h12
  3. [Framework] [Core] les singleton Spring sont-ils multi thread ?
    Par mrjeronimo dans le forum Spring
    Réponses: 8
    Dernier message: 24/06/2008, 12h28
  4. Singleton Multi Thread
    Par g_tarik0010 dans le forum C#
    Réponses: 7
    Dernier message: 18/06/2008, 11h12
  5. [Pattern]PB sur Singleton multi-thread
    Par thibaut dans le forum Général Java
    Réponses: 21
    Dernier message: 11/09/2006, 09h33

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