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 :

Meilleur implémentation de singleton sur un serveur tomcat


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 98
    Par défaut Meilleur implémentation de singleton sur un serveur tomcat
    Bonjour...

    Actuellement nous développons une application n-tiers avec tomcat.

    Afin d'accéder aux service nous passons par des factories.

    Le principe de la factory est de renvoyer un singleton.

    Il a été implémenté de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    	/**
             * Singleton
             */
    	private static DemandeService instance = new DemandeServiceImpl();
    	/**
             * Singleton
             * @return
             */
    	public static DemandeService singleton() {
    		return instance;
    	}
    je ne suis pas trop habitué à cette implémentation et je préfère l'implémentation classique :

    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
     
     
    	/**
             * Singleton
             */
    	private static DemandeServiceImpl instance = null
    	/**
             * Singleton
             * @return
             */
    	public static DemandeService singleton() {
                    if(instance == null)
                     {
                         instance  = new DemandeServiceImpl();
                      }
    		return instance;
    	}

    Dans la mesure ou c'est le serveur qui instancie la factory la première version du code peut-être valide non?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    La première version est bonne (ajouter un final optionnellement sur instance)
    Concernant la seconde,
    il faut ajouter un bloc synchronized :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static DemandeService singleton() {
                    if(instance == null)
                     {
                         synchronized (instance)
                         {
                              if(instance == null)
                                      instance  = new DemandeServiceImpl();
                         }
                      }
    		return instance;
    	}
    pour éviter que deux accès concurrents ne fassent appel au constructeur simultanément.
    On peut aussi en plus déclarer instance comme étant volatile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private static volatile DemandeServiceImpl instance = null

  3. #3
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Attention aux champs static+final dans un serveur d'application, cela peut conduire à des fuites mémoires dans certains cas...

    http://wiki.apache.org/tomcat/Memory...ClassVariables

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 98
    Par défaut
    merci beaucoup pour ces informations

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Par défaut
    Citation Envoyé par ep31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static DemandeService singleton() {
                    if(instance == null)
                     {
                         synchronized (instance)
                         {
                              if(instance == null)
                                      instance  = new DemandeServiceImpl();
                         }
                      }
    		return instance;
    	}
    pour éviter que deux accès concurrents ne fassent appel au constructeur simultanément.
    Petite précision : en java, il existe des cas (je ne sais plus exactement lequel) où 2 threads peuvent quand même passer sur le new DemandeServiceImpl();

    Une bonne lecture sur ce sujet : http://christophej.developpez.com/tu...n/multithread/

  6. #6
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par gailuris Voir le message
    Petite précision : en java, il existe des cas (je ne sais plus exactement lequel) où 2 threads peuvent quand même passer sur le new DemandeServiceImpl();

    Une bonne lecture sur ce sujet : http://christophej.developpez.com/tu...n/multithread/
    Pour info, l'explication (qui est egalement donnée dans le lien) :
    L'implementation de la JVM d'un appel à instance = new Singleton(); peut etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mem = allocate() ;
    instance = mem ;
    ctorSingleton(instance);
    Autrement dit, si on suppose que les 2 premieres intructions s'executent puis qu'un thread plus prioritaire prend la main, alors le premier if (qui n'est pas synchronisé) va etre faux et notre thread prioritaire va garder la main et utiliser une instance non initialisée de Singleton...

    Voir le lien...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/04/2012, 12h42
  2. supprimer les info sur mon serveur TOMCAT exp err 404
    Par liquideshark dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 27/09/2008, 12h39
  3. Réponses: 2
    Dernier message: 25/09/2007, 15h09
  4. Réponses: 4
    Dernier message: 18/04/2006, 17h21
  5. Installer PHP sur un serveur Tomcat
    Par yannick24 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 13/12/2005, 09h36

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