单例模式:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
特点:
1、私有的构造函数
2、私有的复制构造函数
3、私有的赋值操作符
问题:
1、线程安全
2、数据的清理
代码:
一个不是线程安全的代码:
1 class Singleton 2 { 3 public: 4 static Singleton* getInstance() 5 { 6 7 /**< 假如有两个线程,第一个线程运行时,判断pInstance是否为空,因为此时pInstance 8 * ==NULL,那么线程将会进入到if结构体内,假设,就在要执行new Singleton这个操作 9 * 时,时间片结束,那么此时pInstance还是为NULL,此时另一个线程运行,当它进行判 10 * 断时发现pInstance为空,所以会创建一次,当它执行完后,第一个线程执行,又会产 11 * 生一个新的实例,那么将会产生两个,所以此时是线程不安全的。要想保证安全,必须 12 * if前面加锁 13 */ 14 if(pInstance == NULL) 15 { 16 pInstance = new Singleton; 17 } 18 return pInstance; 19 }; 20 private: 21 Singleton(){}; 22 Singleton(const Singleton &); 23 Singleton& operator=(const Singleton &); 24 25 static Singleton *pInstance; 26 }; 27 28 Singleton* Singleton::pInstance = NULL;
而比较常用而且是线程安全的有下面两种方法:
方法一:
1 class Singleton 2 { 3 public: 4 static Singleton* getInstance() 5 { 6 /**< 此函数会在全局区中分配空间,而且在整个程序退出时,清理数据 7 * ,所以就不会存在线程不安全的情况 8 */ 9 static Singleton single; 10 return &single; 11 }; 12 private: 13 Singleton(){}; 14 Singleton(const Singleton &); 15 Singleton& operator=(const Singleton &); 16 };
方法二:
原文:http://www.cnblogs.com/wang-can/p/3675523.html