Singleton Thread-Safe25 mai 2010

Un singleton Thread-Safe permet à l’utilisateur de la classe mise en singleton de ne pas ce soucier du cadre d’utilisation de ce dernier dans un contexte multi-thread.

Le singleton Thread-Safe doit pouvoir être appelé par de multiples thread en même temps et ne pas risquer d’instancier la classe sous-jacente plus d’une fois ou en créant un dead-lock.

Code :

class TTClass
{
    private static readonly object syncLock = new object();
    private static TTClass instance;

    public static TTClass Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncLock)
                {
                    if (instance == null)
                        instance = new TTClass();
                }
            }

            return instance;
        }
    }

    private TTClass()
    {

    }
}

Lien MegaSnippets : A Thread-Safe Singleton

Le premier if permet de s’assurer que l’instance du singleton n’a pas déjà été créée. De plus l’instruction suivante - lock – est couteuse, surtout si de nombreux appels au singleton ont lieu. Voilà pourquoi il y a un premier « if null » avant le bloc de code synchronisé.

Le lock autorise l’accès au code qu’il contient à un thread à la fois. Ce qui signifie que potentiellement, il peut y avoir n thread en attente à cet endroit du code.

Le second if est utile dans le cas ou plusieurs thread étaient justement en attente du lock et débouchent à tour de rôle dans le code du lock. Le premier à y être entrer à créé l’instance du singleton, les suivants n’exécuteront pas le code d’instanciation car « instance » ne sera plus égale à null.

Ce singleton est Thread-Safe.

Cette technique porte le nom de « double check lock ».