Olivier\’s Blog

Dieu a inventé le chat pour que l’homme puisse caresser le tigre

Pattern singleton thread safe en C# : c’est facile

Posted by Olivier on 20/06/2006

Lu ici : http://www.dofactory.com/Patterns/PatternSingleton.aspx

Voici la manière classique d’écrire un pattern singleton thread-safe en C# :

class MySingleton
{
    private static MySingleton instance;

// Lock synchronization object
    private static object syncLock = new object();

private MySingleton() { DoSomething(); }

public static MySingleton Instance
    {
        get
        {
            // Support multithreaded applications
            // through 'Double checked locking'
            // pattern which (once the instance
            // exists) avoids locking each
            // time the method is invoked
            if (instance == null)
            {
                lock (syncLock)
                {
                    if (instance == null)
                        instance = new MySingleton();
                }
            }
            return instance;
        }
    }
}

Et maintenant, voici la manière “.NET” d’écrire ce même singleton :

class MySingleton
{
    // Static members are lazily initialized.
    // .NET guarantees thread safety for
    // static initialization
    private static readonly MySingleton instance =
                        new MySingleton();

// Constructor (private)
    private MySingleton() { DoSomething(); }

public static MySingleton Instance { get { return instance; } }
}

ça marche parce que “private static readonly” entraîne :

  • Initialisation paresseuse
  • Thread-safety garantie par .NET pour les initialisations statiques.

C’est pas beau ça ?

About these ads

5 Responses to “Pattern singleton thread safe en C# : c’est facile”

  1. Ant said

    Merci ça m’a trop aidé dans un développement dans un contexte multithreadé, préemptif avec intropsection multiprotocole.

    Par contre il faut lire la ligne :
    public static Instance { get { return instance; } }

    commme :

    public static MySingleton
    Instance { get { return instance; } }

  2. Olivier said

    Eh Antoine, n’en fais pas trop quand même !

  3. zoopslick said

    People who illegally download films and music will be cut off from the internet under new legislative proposals to be unveiled next week.Internet service providers (ISPs) will be legally required to take action against users who access pirated material, The Times has learnt

  4. Anonymous said

    La solution présentée avec le DLC ne fonctionne de façon sûre qu’avec le mot clé volatile pour l’instance, pour éviter les problème de reordering.
    Voir http://msdn.microsoft.com/en-us/library/ff650316.aspx : “Also, the variable is declared to be volatile to ensure that assignment to the instance variable completes before the instance variable can be accessed.”
    Meme problème en java

  5. get top quality information on Read Even more available

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
Follow

Get every new post delivered to your Inbox.

%d bloggers like this: