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 ».
At last! Someone with real exepirtse gives us the answer. Thanks!