一. 章前小结
在前一个章节中,我们通过IOC的的模式解决了发布后动态切换缓存类型问题,通过CallContext数据槽解决了单线程的实例唯一的问题,那么如果解决全局实例唯一(即多线程内实例唯一),我们很容易的想到了单例模式,提到单例模式,我们很容易想到单例模式的三种形式。
详见:单例模式
二. 构建步骤
利用静态构造函数的单例模式来构建缓存管理类CacheManager。
1 /// <summary> 2 /// 缓存管理类(单例模式管理) 3 /// </summary> 4 public class CacheManager 5 { 6 private static string ICacheDllName = ConfigurationManager.AppSettings["ICacheDllName"]; 7 private static string ICacheClassName = ConfigurationManager.AppSettings["ICacheClassName"]; 8 private CacheManager() 9 { 10 11 } 12 private static ICache _cache = null; 13 14 //静态构造函数且无参数,只有类第一次创建的时候初始化,而且只能调用一次 15 static CacheManager() 16 { 17 Console.WriteLine("--------------------------我要创建对象了----------------------------"); 18 Assembly assembly = Assembly.Load(ICacheDllName); 19 Type type = assembly.GetType(ICacheClassName); 20 _cache = (ICache)Activator.CreateInstance(type); 21 } 22 public static ICache CreateInstance() 23 { 24 return _cache; 25 } 26 }
三. 调用
1 { 2 //发现利用单例模式,既解决了单线程内对象唯一性,也解决了多线程的对象唯一性,只创建一次 3 Console.WriteLine("------------------ 4.多线程测试对象创建-单例模式(开启三个线程) ------------------------"); 4 TaskFactory taskFactory = new TaskFactory(); 5 List<Task> taskList = new List<Task>(); 6 for (int i = 0; i < 3; i++) 7 { 8 Task task = taskFactory.StartNew(() => 9 { 10 GetData3(); 11 }); 12 taskList.Add(task); 13 } 14 //线程等待 15 taskFactory.ContinueWhenAll(taskList.ToArray(), t => 16 { 17 Console.WriteLine("全部完工了"); 18 }); 19 }