using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace _002懶漢式單例模式
{
public class Singleton<T> where T : Singleton<T>, new()
{
private static T instance = null;
private static readonly object mylock = new object();
protected Singleton()
{
}
public static T Instance
{
get
{
//利用雙鎖模式避免高併發下非單例模式
if (instance == null)
{
lock (mylock)
{
if (instance == null)
{
instance = Activator.CreateInstance(typeof(T)) as T;
}
}
}
return instance;
}
}
}
public class test : Singleton<test>
{
public test()
{
}
public void HelloWorld()
{
Console.WriteLine(this.GetHashCode());
}
}
internal class Program
{
private static void Main(string[] args)
{
test t1 = test.Instance;
t1.HelloWorld();
test t2 = test.Instance;
t2.HelloWorld();
/*
* 在高併發的情況下
*
* lock前後有可能一瞬間生成物件
*
* 所以利用單鎖雙判定規避非單例事件
*
* 關鍵理解lock以及雙判定模式
*/
Console.ReadKey();
}
}
}