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 CodeUnivers : 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!