随笔 - 11  文章 - 0 评论 - 0 阅读 - 9092
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

设计模式之单例模式

先看代码

class Singleton{
public:
   //获取实例接口
   static Singleton * getInstance(){
       if (m_instance == nullptr){
           m_instance = new Singleton();
       }
       return m_instance;
   }
private:
   //构造函数私有化,不允许使用者生成对像。
   Singleton();
   Singleton(const Singleton& other);
   //静态成员变量
   static Singleton * m_instance:
}
//静态成员初始化
Singleton* Singleton::m_instance = nullptr;

这是C++中最基本的单例模式实现方法,但是他不是线程安全的,在多线程调用的情况下,可能线程A调用了getInstance(),在new 还没有完成的时间,线程B也调用了getInstance().就会出现问题。当然,我们可以在使用多线程之前调用一次,即可解决这个问题。
在C++ 11中,C++ 保证静态局部变量初始化过程是线程安全的。因此我们可以用以下方式,简单快捷的实现线程安全版的单例模式。

class Singleton{
public:
   //获取实例接口
   static Singleton& getInstance(){
       static Singleton m_instance;
       return m_instance;
   }
private:
   //构造函数私有化,不允许使用者生成对像。
   Singleton();
   Singleton(const Singleton& other);
}

Java中实现单例模式类似可以使用synchronized来实现线程安全,这程称为懒汉式

//懒汉式单例 线程安全实现
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

还可以基于 classloader 机制避免多线程的同步问题(饿汉式)

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}
posted on   曹操是个好同志  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示