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

C# Discussion :

Singleton et Multithreading


Sujet :

C#

Vue hybride

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 255
    Par défaut Singleton et Multithreading
    En lien avec mon topic Conception Singleton et Multithreading

    Voici une implémentation théorique en C# qui reprend l'idée de mehdiing :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    	public class Singleton
    	{
    		static private Singleton _instance;
    		static private bool _verrou=false;
    		static private int _maxWaitingDuringTime=20000;
    		static public int MaxWaitingDuringTime
    		{
    			get{return _maxWaitingDuringTime;}
    			set{_maxWaitingDuringTime=value;}
    		}
     
    		static Singleton()
    		{
    			_instance=new Singleton();
    		}
    		private Singleton()
    		{
     
    		}
     
    		public static Singleton GetInstance()
    		{
    			int waitingDuringTime=0;
    			int baseWaitingLoop=100;
    			int iLoop=0;
    			while(true){
    				iLoop++;
    				//Console.WriteLine(Thread.CurrentThread.Name+": Waiting for Singleton");
    				Thread.Sleep(baseWaitingLoop*iLoop);
    				waitingDuringTime+=baseWaitingLoop*iLoop;
    				lock(_instance)
    				{
    					if(!_verrou) break;
    				}
    				if(waitingDuringTime>MaxWaitingDuringTime) throw new ThreadStateException("Waiting access for "+waitingDuringTime+" ms while max allowed is "+MaxWaitingDuringTime);
    			}
    			lock(_instance)
    			{
    				_verrou=true;
    			}
    			return _instance;
    		}
     
    		public static void Release(ref Singleton p_instance)
    		{
    			lock(_instance)
    			{
    				_verrou=false;
    				p_instance=null;
    			}
    		}
    	}
    Qu'en pensez-vous ?

  2. #2
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Pour ce qui est des Singleton en C#, jettes un oeil a cet article, ca devrait peut-etre t'aider :
    http://webman.developpez.com/article...rns/singleton/

    Sinon, pour une discussion plus longue (mais en anglais) :
    http://www.yoda.arachsys.com/csharp/singleton.html

    En note de bas de page, le pattern Singleton est le plus mal utilise de tous les patterns du GoF, dans 80% des cas, il est avantageusement remplace par une Factory (mais bon, c'est mon avis a moi que j'ai...)

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 255
    Par défaut
    Pourquoi et comment une Factory pourrait remplacer un Singleton ?

  4. #4
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Souvent, les singleton sont utilises a mauvais escient.

    Le problème, c'est qu'un singleton introduit un couplage fort entre les classes qui sont des singletons et leurs consommateurs.

    Le but du singleton est normalement de limiter les acces a une ressource (par exemple, un port E/S, ou autre), dans quasiment tous les autres cas, une variable globale, une factory ou un outil dÍoC procurera le meme "service", le couplage fort en moins

    Apres, tout depends de ce que tu veux faire

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 255
    Par défaut
    ça m'intéresse ce que tu me dis là !

    En fait je voulais faire ceci :

    - un singleton pour faciliter l'accès à la configuration
    - un singleton pour l'accès au logger
    - un singleton pour centraliser/dispatcher des événements
    - un singleton pour l'accès à la base

    Tout un programme si je puis dire !
    Dans ces cas de figures précis peux-tu me suggérer autre choses que des singletons ?

  6. #6
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Citation Envoyé par behess Voir le message
    - un singleton pour faciliter l'accès à la configuration
    Pourquoi ? Une factory toute bete marchera aussi bien

    - un singleton pour l'accès au logger
    La plupart des frameworks de log doivent deja gerer le cas

    - un singleton pour centraliser/dispatcher des événements
    Pourquoi un singleton ? Une queue centralisee, ca ne va pas ?

    - un singleton pour l'accès à la base
    Probablement une mauvaise idee...Si tu es en asp.net, ca va tout peter, si tu es en winform, ca revient au meme qu'avoir une variable globale...

    ...bon, je crois que tout le monde a compris que j'ai ma carte du mouvement contre la singletonite

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par behess Voir le message
    Voici une implémentation théorique en C# qui reprend l'idée de mehdiing :
    [...]
    Qu'en pensez-vous ?
    Ca me parait beaucoup, beaucoup trop compliqué pour être fiable...

    Regarde le lien indiqué par Philippe sur le site de Jon Skeet, la dernière implémentation proposée est à la fois simple et robuste. Je te la recopie ici :

    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
    public sealed class Singleton
    {
        Singleton()
        {
        }
     
        public static Singleton Instance
        {
            get
            {
                return Nested.instance;
            }
        }
     
        class Nested
        {
            // Explicit static constructor to tell C# compiler
            // not to mark type as beforefieldinit
            static Nested()
            {
            }
     
            internal static readonly Singleton instance = new Singleton();
        }
    }
    Ca combine lazy initialization et thread safety (désolé je trouve pas de traduction française appropriée pour ces termes )

    Après, le singleton n'est pas forcément la solution la plus appropriée dans ton cas, mais voilà au moins comment en faire un "fiable" (enfin je suppose, j'ai tendance à prendre les écrits de Jon Skeet pour parole d'évangile )

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

Discussions similaires

  1. Singleton et multithreading
    Par alladdin dans le forum Langage
    Réponses: 8
    Dernier message: 29/07/2010, 23h31
  2. Singleton et multithread
    Par totoche dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 25/05/2010, 18h05
  3. [Singleton] singleton et multithreading
    Par behess dans le forum Design Patterns
    Réponses: 17
    Dernier message: 24/09/2009, 18h33
  4. Singleton et multithreading
    Par Alp dans le forum C++
    Réponses: 17
    Dernier message: 06/08/2006, 02h49

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