跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

单例模式:懒汉和饿汉,哪种更适合你?

大家好,我是顺亿,今天我们来聊聊单例模式,特别是懒汉模式和饿汉模式,这两种模式有什么区别,哪种更适合你?

单例模式的基本原理

首先,什么是单例模式?简单来说,单例模式确保一个类只有一个实例,并提供一个全局访问点。这样做的目的是为了减少内存消耗,避免资源冲突。

懒汉模式

懒汉模式的特点是在第一次使用时才创建实例。下面是一个简单的懒汉模式示例:

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)了解更多内容。

相关文章