单例模式

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) 使用“双检锁”的方式保证线程安全

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值