单例模式(singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
1、懒汉模式
class Singleton { private: Singleton(){} static Singleton *p; public: static Singleton* getInstance(){ if (p == nullptr) p = new Singleton(); return p; } }; Singleton* Singleton::p = nullptr; int main() { Singleton* a = Singleton::getInstance(); Singleton* b = Singleton::getInstance(); if (a == b) cout << "懒汉单例" << endl; return 0; }
2、内部静态变量懒汉模式
class Singleton { private: Singleton(){} public: static Singleton* getInstance(){ static Singleton *p; return p; } }; int main() { Singleton* a = Singleton::getInstance(); Singleton* b = Singleton::getInstance(); if (a == b) cout << "懒汉单例(静态内部变量)" << endl; return 0; }
3、饿汉模式
class Singleton { private: Singleton(){} static Singleton *p; public: static Singleton* getInstance(){ return p; } }; Singleton* Singleton::p = new Singleton(); int main() { Singleton* a = Singleton::getInstance(); Singleton* b = Singleton::getInstance(); if (a == b) cout << "饿汉单例" << endl; return 0; }
单个线程只允许一个实例存在,多线程就会存在多个实例,如果想让多个线程只创建一个实例,有两种方法,双重锁定懒汉模式和饿汉模式。
为什么饿汉模式不会出现多线程创建实例冲突?
答:实例都已经创建好了冲突个毛线!