大家好,我是顺亿,今天我们来聊聊单例模式,特别是懒汉模式和饿汉模式,这两种模式有什么区别,哪种更适合你?
单例模式的基本原理
首先,什么是单例模式?简单来说,单例模式确保一个类只有一个实例,并提供一个全局访问点。这样做的目的是为了减少内存消耗,避免资源冲突。
懒汉模式
懒汉模式的特点是在第一次使用时才创建实例。下面是一个简单的懒汉模式示例:
class singleclass{
public:
static singleclass* getinstance() {
if (instance ==nullptr){
instance=new singleclass();
}
return instance;
}
private:
static singleclass* instance;
singleclass() {};//构造函数设为私有
};
singleclass* singleclass::instance=nullptr;
懒汉模式存在线程安全问题,因为在多线程环境下,可能会创建多个实例。
线程安全的懒汉模式
为了解决线程安全问题,我们可以使用锁来保证线程安全:
class singleclass{
public:
static singleclass* getinstance() {
if (instance ==nullptr){
i_mutex.lock();
if (instance ==nullptr){
instance=new singleclass();
}
i_mutex.unlock();
}
return instance;
}
private:
static singleclass* instance;
static std::mutex i_mutex;
singleclass() {};//构造函数设为私有
};
singleclass* singleclass::instance=nullptr;
std::mutex singleclass::i_mutex;
饿汉模式
饿汉模式在类加载时就创建了实例,下面是一个简单的饿汉模式示例:
class singleclass{
public:
static singleclass* getinstance() {
return instance;
}
private:
static singleclass* instance;
singleclass() {};//构造函数设为私有
};
singleclass* singleclass::instance=new singleclass();
饿汉模式没有线程安全问题,但可能会在类加载时就占用内存。
总结
懒汉模式和饿汉模式各有优缺点,选择哪种模式取决于具体的应用场景。
我是顺亿,如果你对编程有任何疑问,欢迎访问「趣航编程网」(www.vqhf.com)了解更多内容。
