1、单例模式和多线程
不考虑多线程,单例可以代码如下:
class Singleton { public: static Singleton* instance(); private: static Singleton* pInstance; };
Singleton* Singleton::pInstance = nullptr;
Singleton* Singleton::instance() { if (nullptr == pInstance) { // 步骤1、指针判空 pInstance = new Singleton; // 步骤2、赋值 } return pInstance; } |
单线程执行没有任何问题,当多线程的时候,线程A和B可能同时执行 步骤1 成功,因此线程A、B都创建了一个单例对象Singleton,很明显,这违反了singleton的意思,因为现在有两个singleton对象,只要在判断pInstance为空之前加锁,就很容易实现线程安全,代码如下:
class Singleton { public: static Singleton |