单例模式

单例模式中,一个类只能有一个实例

一、实现

        将默认构造函数、拷贝构造设为私有; 通过静态成员变量和静态成员函数来生成、获取单个实例。

       

二、线程安全

       上述例子对于单线程没问题,但对于多线程可能会出错(某个线程在生成实例时,其他线程也可能进入并生成实例)。

       1、一种办法是加锁,但代价较高:当只是读取实例时,也需要加锁判断,比较费时;

       

  2、双检查锁:在获取锁之前,加一个判断。很有意思的思路,可惜是错误的,无法使用。在生成实例时,有的编译器会优化生成实例过程,

造成在调用构造函数之前,已经对m_instance进行赋值,此时如果有其他实例进入,则会造成获取的实例无法使用;

       

           3、c++11之后引入的方法,使用atomic库来保证,在生成实例时,编译器不要优化生成实例的过程,按照顺序生成即可。

        

 

posted @ 2019-01-07 16:46  牧马人夏峥  阅读(103)  评论(0编辑  收藏  举报