static void Main(string[] args) { //设计模式,单例 PrintLog("-------------这是单例模式---------------------"); { Console.WriteLine("单例模式的第一种做法"); //ProductInfoOne productInfo1 = ProductInfoOne.CreateInstance(); //ProductInfoOne productInfo2 = ProductInfoOne.CreateInstance(); //通过上面这个做法,就知道了,这个是单例。 Console.WriteLine("上面这种做法有什么问题呢"); // Console.WriteLine("先插一句,什么是懒汉式,饿汉式"); Console.WriteLine("懒汉式:利用延迟加载的思想,用到了才去创建实例(或者去内存中找,有了就不new)"); Console.WriteLine("饿汉式:不管你内存有没有,我都直接去new"); Console.WriteLine("一般平时编程中,用懒汉式的情况多一点"); // } // //PrintLog("接下来就是看看刚刚那种情况有什么问题。"); //{ // for (var i = 0; i < 5; i++) // { // Task.Run(() => // { // ProductInfoOne.CreateInstance(); // }); // } // //也就是说,在多线程的情况下,还是有可能不是单例。那要怎么解决呢,接下来看第二种实现 //} PrintLog("......多线程的单例..."); { for (var i = 0; i < 5; i++) { Task.Run(() => { ProductInfoTwo.CreateInstance(); }); } } PrintLog("多线程的单例,人家说的双if加lock是怎么回事呢"); { //这里是双if+lock的。 } Console.ReadKey(); }
public static ProductInfoTwo CreateInstance() { //外面这个lock,当第一个线程过来的时候,第二个线程,第三个线程过来的时候, //加上这个lock,第一个线程进来,就知道给_instance赋值了,所以后面就不要在这里继续排队了。 //这样也可能提高效率。所以,这样子,就引出了我们双if+lock的写法了。 lock (Object) { //如果这里代码这么写的话呢,可能会有问题,为什么呢 //你自己想想, if (_instance == null) { _instance = new ProductInfoTwo(); } } return(_instance); }