单例模式

1. 单例模式

  1. 意图
    保证一个类仅有一个实例,并提供一个访问它的全局访问点。
  2. 动机
    对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机( printer spooler),只应该有一个文件系统和一个窗口管理器。

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:

1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。

2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

这里写图片描述

2. 单例模式的C++实现

#include <mutex>
using namespace std;

class Singleton
{
private:
    static mutex mu;
    static Singleton* m_instance;
    Singleton(){};
    Singleton(const Singleton &);  
    Singleton& operator = (const Singleton &);  

    class DelInstance // 它的唯一工作就是在析构函数中删除CSingleton的实例  
    {
    public:
        ~DelInstance()
        {  
            if (CSingleton::m_pInstance)
                delete CSingleton::m_pInstance;
        }
    };
    static DelInstance delIns; 
    //定义一个静态成员,在程序结束时,系统会调用它的析构函数

public:
    static Singleton* Instance(){
        if (m_instance == NULL){
            std::lock_guard<std::mutex> Lock(mu);
            if(m_instance==NULL){
                m_instance = new Singleton();
            }
        }
        return m_instance;
    }

};

//类的静态变量需要手动初始化
Singleton* Singleton::m_instance = 0;
mutex Singleton::mu;
Singleton::DelInstance Singleton::delIns;

单例模式的Java实现

参考《Head First Design Pattern》

(1) 简单实现

这里写图片描述

(2) 考虑线程安全

这里写图片描述

(3) 线程安全升级版

这里写图片描述

(4) 使用“双检锁”的方式保证线程安全

这里写图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值