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(); } } }