VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#教程之C#设计模式 —— 单例模式

 嗯,这是本人的第一篇随笔,就从最简单的单例模式开始,一步一步地记录自己的成长。

  单例模式是最常见的设计模式之一,在项目代码中几乎随处可见。这个设计模式的目的就是为了保证实例只能存在一个。单例模式往下还能再细分为懒汉模式和饿汉模式。下面逐个来看。

1.饿汉模式

  饿汉模式的做法是在类加载的时候就完成实例化,是线程安全的做法。

复制代码
 1     public class Singleton
 2     {
 3         //类加载的时候完成实例化
 4         private static Singleton instance = new Singleton();
 5 
 6         private Singleton()
 7         {
 8         }
 9 
10         //直接返回实例
11         public static Singleton Instance
12         {
13             get
14             {
15                 return instance;
16             }
17         }
18     }
复制代码

 

2.懒汉模式

  懒汉模式的做法就是在类加载的时候不创建实例,在第一次使用的时候才创建。但是这种做法并不是线程安全的,如果多个线程同时调用Instance,便会有多个实例创建,这就违反了单例模式的初衷。

复制代码
 1     public class Singleton
 2     {
 3         // 类加载的时候不直接创建实例
 4         private static Singleton instance;
 5 
 6         private Singleton()
 7         {
 8 
 9         }
10 
11         public static Singleton Instance
12         {
13             get
14             {
15                 if (instance == null)
16                 {
17                     //第一次使用的时候创建实例
18                     instance = new Singleton();
19                 }
20 
21                 return instance;
22             }
23         }
24     }
复制代码

3.线程安全懒汉模式

  如何保证线程安全的同时又实现懒汉模式?最简单的方式就是在if判断外上锁。

复制代码
 1     public class Singleton
 2     {
 3         private static Singleton instance;
 4 
 5         private static readonly object locker = new object();
 6 
 7         private Singleton()
 8         {
 9 
10         }
11 
12         public static Singleton Instance
13         {
14             get
15             {
16                 //上锁
17                 lock (locker)
18                 {
19                     if (instance == null)
20                     {
21                         instance = new Singleton();
22                     }
23                 }
24 
25                 return instance;
26             }
27         }
28     }
复制代码

  但是这种做法在每次访问前的需要上锁,会影响多线程的性能,于是我们又有了双重检验锁。

4.双重检验锁

  我们只需要在上锁之前再作一次if判断,就不会每次访问的时候都需要上锁了。

复制代码
 1     public class Singleton
 2     {
 3         private static Singleton instance;
 4 
 5         private static readonly object locker = new object();
 6 
 7         private Singleton()
 8         {
 9 
10         }
11 
12         public static Singleton Instance
13         {
14             get
15             {
16                 if (instance == null)
17                 {
18                     lock (locker)
19                     {
20                         if (instance == null)
21                         {
22                             instance = new Singleton();
23                         }
24                     }
25                 }
26 
27                 return instance;
28             }
29         }
30     }


相关教程