单例模式中,一个类只能有一个实例
一、实现
将默认构造函数、拷贝构造设为私有; 通过静态成员变量和静态成员函数来生成、获取单个实例。
二、线程安全
上述例子对于单线程没问题,但对于多线程可能会出错(某个线程在生成实例时,其他线程也可能进入并生成实例)。
1、一种办法是加锁,但代价较高:当只是读取实例时,也需要加锁判断,比较费时;
2、双检查锁:在获取锁之前,加一个判断。很有意思的思路,可惜是错误的,无法使用。在生成实例时,有的编译器会优化生成实例过程,
造成在调用构造函数之前,已经对m_instance进行赋值,此时如果有其他实例进入,则会造成获取的实例无法使用;
3、c++11之后引入的方法,使用atomic库来保证,在生成实例时,编译器不要优化生成实例的过程,按照顺序生成即可。