一、懒汉模式
懒汉模式存在线程安全问题
1、双重检测锁(一坨)
1 |
|
双重检测锁在C++中存在内存顺序问题。例如,
instance = new DoubleCheckedSingleton()这行代码在编译器优化下可能会重排序为:
- 分配内存
- 将指针赋值给instance变量
- 构造对象
如果执行顺序变为1→2→3,在进行到2时实例已经非空,但实例还未构建,如果此时有第三个线程想要获取实例,就会返回一个空的实例!
2、静态局部变量(最推荐的方式)
1 |
|
二、饿汉模式
在程序加载时就创建,天然线程安全,无需加锁
1、引用方式
1 |
|
2、指针方式
1 |
|
三、补充
C++单例类初始化顺序会导致一些问题,详细可以查看这篇文章