设计模式 之 单例模式

本文解释设计模式中单例模式的不同写法(懒汉式、饿汉式、双检锁…)

懒汉式(线程不安全的)

懒汉式是用来做反面教材的,来说明一般人会很少考虑到的并发问题~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Singleton
{
private Singleton() { } // 构造函数私有,外部不能实例化

private static Singleton instance;

public static Singleton GetInstance()
{
// 如果 线程A 运行到这里切换到 线程B,那么就会产生 2个实例~
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}

那么在懒汉式上加个锁看看~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Singleton
{
private Singleton() { } // 构造函数私有,外部不能实例化

private static Singleton instance;
private static readonly object locker = new object();

//[MethodImpl(MethodImplOptions.Synchronized)] // 使用 C# 的语言特性
public static Singleton GetInstance()
{
lock (locker) // 每个线程进来都要被锁,
{
// 虽然做到完全不浪费内存,但就效率而言还不如 懒汉式
if (instance == null)
{
instance = new Singleton();
}
}

return instance;
}
}

能不能做到即不浪费内存又高效呢?

双检锁(Double-Checked)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Singleton
{
private Singleton() { } // 构造函数私有,外部不能实例化

private static Singleton instance;
private static readonly object locker = new object();

public static Singleton GetInstance()
{
if (instance == null) // Single Checked
{
lock (locker)
{
if (instance == null) // Double checked
{
instance = new Singleton();
}
}
}

return instance;
}
}

上面很多语言都可以编写出来,接下来有些实现则是利用语言的特性~

饿汉式

1
2
3
4
5
6
7
8
9
10
11
12
public class Singleton
{
private Singleton(){} // 构造函数私有,外部不能实例化

// 静态变量。 有些语言没有静态变量
private static readonly Singleton instance = new Singleton();

public static Singleton GetInstance()
{
return instance;
}
}

参考资料

.Net 官方文档 - 静态构造函数

觉得文章对您有帮助,请我喝瓶肥宅快乐水可好 (๑•̀ㅂ•́)و✧
  • 本文作者: 阿彬~
  • 本文链接: https://iweixubin.github.io/posts/design-pattern/singleton/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 免责声明:本媒体部分图片,版权归原作者所有。因条件限制,无法找到来源和作者未进行标注。
         如果侵犯到您的权益,请与我联系删除