进击的单例模式
一:幼年体(只适用于单线程)
1.设置单例
public class Singleton { private static Singleton _Singleton = null; public static Singleton CreateInstance() { if (_Singleton == null) { _Singleton = new Singleton(); Console.WriteLine("单例已被创建"); } return _Singleton; } }
2.使用单例
static void Main(string[] args) { TaskFactory taskFactory = new TaskFactory(); List<Task> taskList = new List<Task>(); for (int i = 0; i < 5; i++) { //当多个线程同时判断单例对象为空,那么这个对象将会被创建了几次,因此单例失去了意义 taskList.Add(taskFactory.StartNew(()=> { Singleton s = Singleton.CreateIntance(); })); } Console.ReadKey(); }
二:完全体(可适用于多线程)
设置单例时加一把锁,禁止多个线程同时访问该对象资源
public class Singleton { private static Singleton s = null; private static object singletonLock = new object(); //锁同步 public static Singleton CreateIntance() { lock (singletonLock) { if (s == null) { s = new Singleton(); Console.WriteLine("此类被创建"); } } return s; } }
三:究极体(当单例已被创建时,后者的线程无需再判断单例是否被创建)
public class Singleton { private static Singleton s = null; private static object singletonLock = new object(); //锁同步 public static Singleton CreateIntance() { if (s == null) { lock (singletonLock) { if (s == null) { s = new Singleton(); Console.WriteLine("此类被创建"); } } } return s; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2018-09-12 Linux下yum方式安装mysql 以及卸载mysql
2018-09-12 NAT模式实现局域网物理机与虚拟机的互通访问