Recently I had a code review on one of my colleagues project and found this common implementation there:
public sealed class TheClass {
private TheClass() {}
private static _theClass value;
private static object obj = new Object();
public static Instance Value {
get {
if (TheClass.value == null) {
lock (syncRoot) {
if (TheClass.value == null) {
TheClass.value = new TheClass();
}
}
}
return TheClass.value;
}
}
}
Yes we are talking about the classic Singleton pattern here, but not implemented as the proper or, more importantly, safer way. This implementation could permit a double instantation at some point. In short I’ll just recommend to make _theClass volatile, but I know it’s not the unique way to achieve this and is not always the safer way in all platforms. So searching this on the internet I found a lot of discussions so if you are interested on a deep level reading check this links:
volatile and MemoryBarriers
Double-checked locking in .net at Stackoverflow
Alois Kraus even shows the assembled code!
Lazy Vs Eager Init Singletons / Double-Check Lock Pattern
http://www.yoda.arachsys.com/csharp/singleton.html
And of course the Official Microsoft Pattern
Good reading!
[...] Patrón Singleton y los métodos “Thread Safe” en .Net Inglés Recientemente tuve una revisión de código de un proyecto de uno de mis colegas en el trabajoe y [...]
By: El Patrón Singleton y los métodos “Thread Safe” en .Net « Ernesto Ocampo Blog en Español on March 5, 2010
at 2:06 pm