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 :

[Expert]Singleton =? instancié une seule fois


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 84
    Par défaut [Expert]Singleton =? instancié une seule fois
    Bonjour,

    Pré-requis:
    J'ai un fichier de configuration régulièrement consulté auquel j'accéde à partir de multiple thread. Afin d'éviter la lecture à répétition de ce fichier, je cré un singleton. Mais est il réellement lu et charger en mémoire une seule fois?

    Une instance d'un objet implémentant le pattern singleton est unique. Ca, je n'en doute pas. Si j'y accède à partir de plusieurs thread, la classe ne sera monté qu'une seule fois en mémoire.

    Mais une fois cette instance est en mémoire, que fait le garbage collector si je ne m'en sert pas pendant plusieurs heures? Je crains que cette instance ne soit supprimée et que le fichier sera rechargé lors de la prochaine lecture.

    Si quelqu'un maitrise bien le garbage collector, je suis preneur.


    Arnaud

  2. #2
    ndp
    ndp est déconnecté
    Membre expérimenté Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Par défaut
    hello,

    L'implementation d'un Singleton passe generalement par une variable static qui reference ton instance unique.
    Cette reference est une reference 'dure', montee en memoire a l'endroit de la heap ou les definition des classe sont chargees.
    si je ne me trompe pas, comme ces definitions de classes reste dans la heap, il y aura toujours une reference 'dure' et donc le GC ne liberera pas la memoire.

  3. #3
    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,


    Tant que ton singleton est référencé dans son attribut static, le GC n'y touchera pas ! Donc à moins que tu ais bidouiller le pattern singleton cela ne devrait pas arriver.


    Le gros problème que tu peux avoir, si tu as un code comme cela :
    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
    final class Singleton {
     
    	private static Singleton INSTANCE;
     
    	private Singleton() {
    		// ...
    	}
     
    	public static Singleton getInstance() {
    		if (INSTANCE==null) {
    			INSTANCE = new Singleton();
    		}
    		return INSTANCE;
    	}
    }
    Si plusieurs threads appelle "en même temps" la méthode getInstance(), tu pourrais avoir plusieurs création de singleton entre le moment où il est créé et celui où il est affecté à INSTANCE...


    Il y a des solutions complexes utilisant la synchronisation sans que cela ne soit trop couteux (et de mauvaise solution utilisant mal la synchronisation ), mais dans 99% des cas on peut s'en passer en s'assurant que la méthode sera appelé par un seul et unique thread.

    Soit en appelant getInstance() au tout début de l'application (avant même de créer les autres threads).
    Soit en initialisant en ligne l'instance lors du chargement de la classe (c'est le ClassLoader qui nous assurera l'unicité de l'opération) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    final class Singleton {
     
    	private static final Singleton INSTANCE = new Singleton();
     
    	private Singleton() {
    		// ...
    	}
     
    	public static Singleton getInstance() {
    		return INSTANCE;
    	}
    }

    a++

  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 : 45
    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
    j'ajoute une précision sur l'unicité et le GC. La référence statique est référencée en dure par la classe, donc le singleton ne sera pas GC *tant* que la classe ne sera pas garbage collectable. La pluspart du temps çà veux dire jamais de GC dessus. *mais* si le classloader qui a instancié la classe est libéré (ce qui arrive dans les webapplication) alors le singleton sera nettoyé. On parle plus là d'un singleton par classloader.

    En pratique, c'est un singleton quoi

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 84
    Par défaut
    Je vous remerci de vos réponses.

    Cdlt,

    Arnaud

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

Discussions similaires

  1. [Configuration] filtrer le flux sortant une seule fois, en debut de code...
    Par misstinkiete dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 13/10/2005, 21h20
  2. [DLL] Ma DLL execute le Timer une seul fois !
    Par TOTO32 dans le forum Langage
    Réponses: 14
    Dernier message: 13/08/2005, 20h37
  3. Réponses: 1
    Dernier message: 19/03/2005, 22h47
  4. Réponses: 18
    Dernier message: 10/02/2005, 13h22
  5. Réponses: 2
    Dernier message: 30/11/2004, 11h48

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