Use static initilization to implement thread safe singleton.
public sealed class SingleTon
{
#region Singleton
static readonly SingleTon instance = new SingleTon();
static string path;
private static object syncObject = new object();
//static SingleTon()
//{
//}
private SingleTon()
{
Init();
}
public static SingleTon Instance
{
get
{
return instance;
}
}
#endregion
private void Init()
{
path = ConfigurationManager.AppSettings["LogFilePath"];
Thread.Sleep(20000);
Console.WriteLine(DateTime.Now.ToString() + Thread.CurrentThread.Name+ " SingleTon Init");
}
}
Test:
/// <summary>
///A test for Instance
///</summary>
[TestMethod()]
public void InstanceTest()
{
Console.WriteLine(DateTime.Now.ToString() + "InstanceTest start");
Thread t1 = new Thread(new ThreadStart(InstanceTestMethod1));
t1.Name = "t1";
t1.Start();
Thread.Sleep(1000);
Thread t2= new Thread(new ThreadStart(InstanceTestMethod2));
t2.Name = "t2";
t2.Start();
Thread.Sleep(40 * 1000);
Console.WriteLine(DateTime.Now.ToString() + "InstanceTest end");
}
private void InstanceTestMethod1()
{
Console.WriteLine(DateTime.Now.ToString() + "InstanceTestMethod1 start");
SingleTon actual = SingleTon.Instance;
Console.WriteLine(DateTime.Now.ToString() + "InstanceTestMethod1 end");
SingleTon actual2 = SingleTon.Instance;
Console.WriteLine(DateTime.Now.ToString() + "InstanceTestMethod1 actual2 end");
}
private void InstanceTestMethod2()
{
Console.WriteLine(DateTime.Now.ToString() +"InstanceTestMethod2 start");
SingleTon actual = SingleTon.Instance;
Console.WriteLine(DateTime.Now.ToString() + "InstanceTestMethod2 end");
SingleTon actual2 = SingleTon.Instance;
Console.WriteLine(DateTime.Now.ToString() + "InstanceTestMethod2 actual2 end");
}