本文主要是介绍单例模式,懒汉饿汉,线程安全,double checked locking的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
概览
- 本文目的
- 单例
- 饿汉模式
- 懒汉模式
- 线程安全的Singleton实现
- 懒汉普通加锁
- double checked locking
- double checked locking 靠不住?
- 静态局部变量实现
- 尾语
本文目的
之前在看《Linux多线程服务端编程-使用muduo C++网络库》,看到 2.5 线程安全的Singleton实现 时,里面对单例模式的线程安全有这么一句话, 人们一直认为double checked locking是王道,有“神牛”指出由于乱序执行的影响,DCL(double checked locking)是靠不住的。 这对于没有经验的初学者有些难懂,所以我打算在这篇文章里,讲一讲,什么是单例,什么是double checked locking,double checked locking又为什么靠不住。
单例
单例模式,简单来说就是保证一个类最多存在一个实例,并且这种保证是来自于设计者,而不是使用者。而实现这样需求的办法就是:让类的构造函数私有,在类内创建一个静态对象,并创建一个公有的静态方法访问这个对象。
可能会有人问, 为什么创建的对象必须是静态的? 因为我们在外面没办法创建这个对象,需要通过类来调用方法,而不是通过对象调用方法。要想通过类来调用方法,那么这个方法必须是static静态的(不需要this指针)。而静态的方法内只能调用类中的静态数据,所以,类内创建的对象必须是静态的。(下面可以看具体的代码)
单例模式的实现有懒汉模式和饿汉模式。下面是这两种模式的实现。
饿汉模式
饿汉模式,就是在类定义的时候就实例化了(因为饿,主观能动性强 - . -)。
是线程安全的,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现(不用锁机制,开销小),可以实现更好的性能。
5 class Singleton{6 private:7 Singleton(){8 cout<<"i am single"<<endl;9 }10 11 static Singleton* instance;12 public:13 static Singleton* getInstance(){14 return instance;15 }16 };17 18 Singleton* Singleton:: instance = new Singleton();19 20 int main(){21 Singleton* one = Singleton::getInstance();22 Singleton* two = Singleton::getInstance();23 if(one == two){24 cout<<"确实是单例!"<<endl;
这篇关于单例模式,懒汉饿汉,线程安全,double checked locking的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!