1.优点
只有一个实例
2.缺点
a)这个实例不能随时释放掉,占用资源。
b)每次使用,都要判断是否为空,增加消耗
3.适用场景
只能有一个实例的业务场景,例如:数据库连接对象(每次连接都是同一个连接)、打印(多次打印,但同时只能一个在打印)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { /// <summary> /// 第一种:经典模式,每次都判空,增加消耗,这是缺点 /// </summary> public class ClassStaticTest { private static ClassStaticTest instance; private ClassStaticTest() { } public static ClassStaticTest GetInstance() { if (instance == null) { instance = new ClassStaticTest(); } return instance; } public int Age { get; set; } public string Name { get; set; } public void DoSome() { Console.WriteLine(Age); Console.WriteLine(Name); } } /// <summary> /// 第二种:多线程安全 /// </summary> public class ClassStaticTest2 { private static object obj = new object(); private static ClassStaticTest2 instance; private ClassStaticTest2() { } public static ClassStaticTest2 GetInstance() {
//双重加锁 if (instance == null) { lock (obj) { if (instance == null) { instance = new ClassStaticTest2(); } } } return instance; } public int Age { get; set; } public string Name { get; set; } public void DoSome() { Console.WriteLine(Age); Console.WriteLine(Name); } } /// <summary> /// 第三种:CLR解决线程安全,当没有用到该类时,实例都存在,这是缺点 /// </summary> public class ClassStaticTest3 { private static readonly ClassStaticTest3 instance = new ClassStaticTest3(); private ClassStaticTest3() { } public static ClassStaticTest3 GetInstance() { return instance; } public int Age { get; set; } public string Name { get; set; } public void DoSome() { Console.WriteLine(Age); Console.WriteLine(Name); } } }