Some Test that I made, a scnenario where two or more instances of singleton class may appear.
THE AMAZING RACE OF 100 THREADS TOWARDS THE MIGHTY SINGLETON!
*** FIRST ATTEMPT *** ( 2 DIFFERENT INSTANCE, 98 SAME)
Code:
T_0 is now initializing Singleton class
T_1 is now initializing Singleton class
T_0 Done...
This is T_0 - Singleton: 63835064
T_1 Done...
This is T_1 - Singleton: 6044116
T_2 Done...
This is T_2 - Singleton: 6044116
T_3 Done...
This is T_3 - Singleton: 6044116
.
.
.
This is T_99 - Singleton: 6044116
Press any key to continue . .
*** SECOND ATTEMPT *** ( 10 DIFFERENT INSTANCE, 80 SAME)
Code:
T_0 is now initializing Singleton class
T_1 is now initializing Singleton class
T_2 is now initializing Singleton class
T_3 is now initializing Singleton class
T_4 is now initializing Singleton class
T_5 is now initializing Singleton class
T_6 is now initializing Singleton class
T_7 is now initializing Singleton class
T_8 is now initializing Singleton class
T_9 is now initializing Singleton class
T_0 Done...
This is T_0 - Singleton: 63835064
T_1 Done...
This is T_1 - Singleton: 6044116
T_2 Done...
This is T_2 - Singleton: 4032828
T_3 Done...
This is T_3 - Singleton: 35320229
T_4 Done...
This is T_4 - Singleton: 12547953
T_5 Done...
This is T_5 - Singleton: 12036987
T_6 Done...
This is T_6 - Singleton: 62476613
T_7 Done...
This is T_7 - Singleton: 45653674
T_8 Done...
This is T_8 - Singleton: 39086322
T_9 Done...
This is T_9 - Singleton: 20974680
.
.
T_16 Done...
This is T_16 - Singleton: 20974680
T_17 Done...
This is T_17 - Singleton: 20974680
.
.
.
T_99 Done...
This is T_18 - Singleton: 20974680
MAIN CODE:
Code:
public static void Main()
{
int MAX = 100;
Thread[] MyThreads = new Thread[MAX];
for (int i = 0; i < MAX; i++)
{
MyThreads[i] = new Thread(new ParameterizedThreadStart(TestSearch.TestSingleton));
MyThreads[i].Name = "T_" + i.ToString();
}
for (int i = 0; i < MAX; i++) MyThreads[i].Start();
}
TestSingleton Method
Code:
public static void TestSingleton(object o)
{
Singleton s = Singleton.getInstance();
if (!Singleton.IsDone) Console.WriteLine("This is {0} - Singleton: {1}", Thread.CurrentThread.Name, s.GetHashCode());
else Console.WriteLine("This is {0} - Singleton: {1}", Thread.CurrentThread.Name, s.GetHashCode());
}
Singleton getInstance Method
Code:
public static Singleton getInstance()
{
if (MyInstance == null)
{
MyInstance = new Singleton();
}
Console.WriteLine("{0} Done...", Thread.CurrentThread.Name);
return MyInstance;
}
Solution
many to mentioned... some are yet to be discovered by kamsky 
