码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式的三种写法和优缺点

时间:2017-12-08 23:57:27      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:pre   object   情况   null   style   标准   单例模式   generic   静态   

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 namespace ConsoleApp1
 5 {
 6     class Singleton
 7     {
 8         private static Singleton _singleton = null;
 9         private static object singleton_Lock = new object();  //对象锁
10 
11         /// <summary>
12         /// 标准的单例模式
13         /// </summary>
14         /// <returns></returns>
15         public static Singleton CreateInstance()
16         {
17             if (_singleton == null)//保证对象初始化化之后的所有线程,不需要等待锁
18             {
19                 lock (singleton_Lock)//保证只有一个线程进去判断
20                 {
21                     if (_singleton == null)//保证对象为空才创建
22                     {
23                         _singleton = new Singleton();
24                     }
25                 }
26             }
27             return _singleton;
28         }
29    }//Class_end
30 }

第一种单例的写法,是用两个if加一个Lock来优化在多线程情况下调用单例的耗时,而下面是第二种写法(下图),效果一样,但更加简单

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 namespace ConsoleApp1
 5 {
 6     class Singleton
 7     {
 8         private static Singleton _Singleton = null;
 9 
10         /// <summary>
11         /// 静态构造函数:由CLR保证,在第一次调用之前调用,只调用一次
12         /// </summary>
13         static Singleton()
14         {
15             _Singleton = new Singleton();
16         }
17 
18         public static Singleton CreateInstance()
19         {
20             return _Singleton;
21         }
22       }//Class_end
23 }
第三种单例的写法更简单,直接在声明静态变量的时候创建实例化类
 1 using System;
 2 using System.Collections.Generic;
 3 
 4 namespace ConsoleApp1
 5 {
 6     class Singleton
 7     {
 8         //静态变量会在类型第一次使用的时候初始化,而且只初始化一次
 9         private static Singleton _singleton = new Singleton();
10         public static Singleton CreateInstance()
11         {
12             return _singleton;
13         }
14       }//class_end
15 }
这三种单例的写法,其实效果都一样,只是后面两种是由系统CLR帮我们调用创建实例类。
单例的优点是:保证整个进程中该对象只被实例化一次,减少性能消耗
缺点是:常驻内存,不会被GC回收(普通类型需要的时候就初始化,用完被GC自动回收),而且过多使用单例,而单例类本身带有公有变量,就会很容易造成严重的问题

单例模式的三种写法和优缺点

标签:pre   object   情况   null   style   标准   单例模式   generic   静态   

原文地址:http://www.cnblogs.com/BigDong/p/8007440.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!