设计模式之单例模式
先看代码
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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧