设计模式之单例模式
先看代码
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;
}
}