设计模式-单例模式(线程安全)

本文介绍了单例模式的基本概念及其在不同场景下的实现方式,包括懒汉模式和饿汉模式,并对比了它们之间的性能差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:单例模式是设计模式中比较简单的一种,但是又因为简单常见在面试中又是经常出现的一个设计模式。所以必须要会啊。之前也只是会写线程不安全的单例模式。

单例模式:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

1、懒汉模式

全局的单例实例在第一次被使用时构建。

class Singleton
{
private:
    static Singleton* instance;
    Singleton(){}
public:
    static Singleton* getInstance();
};

Singleton* Singleton::getInstance()
{
    if(NULL == instance)
    {
        Lock();//这里使用标准库或者其他第三方库(伪代码)
        if(NULL == instance)
        {
            instance = new Singleton;
        }
        UnLock();
    }
    return instance;
}

Note:如果我们使用懒汉模式处理大量数据,性能会成为一个问题(因为使用了两次条件判断)


2、饿汉模式

无论是否调用该类的实例,都会创建一个该类的实例,然后通过接口返回该类的这个唯一实例。饿汉模式通过静态实例初始化保证线程安全(不需要加锁)。所以在需要考虑性能的时候,需要采用这种模式,可以避免频繁的锁争夺。

class Singleton
{
private:
    static const Singleton* instance;
    Singleton(){}
public:
    static const Singleton* getInstance()
    {
        return instance;
    }
};

const Singleton* Singleton::instance = new Singleton;


3、enum枚举

最后介绍的一种就是枚举,但是枚举这种方式只能在Java这种语言中才可以使用,在cpp中就不行;因为在Java中枚举是对象。具体的相关内容可以查阅相关资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值