zoukankan      html  css  js  c++  java
  • [C++设计模式] singleton 单例模式

    这个设计模式主要目的是想在整个系统中仅仅能出现一个类的实例。这样做当然是有必定的。比方你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等。

    你希望这个类在整个系统中仅仅能出现一个实例。

    一、调用pthread_once()实现了一个线程安全的版本号:

     

    pthread_once()函数具体解释

    代码:

    template <class T>
    class Singleton
    {
    public:
        static T& instance()
        {
            pthread_once(&ponce_,&Singleton::init);
            return *value_;
        }
        static void init()//加了一层封装,适应不同类型的初始化函数
        {
            value_ = new T();
        }
    private:
        Singleton();
        ~Singleton();
        static pthread_once_t ponce_;
        static T * value_;
    };
    template <class T>
    pthread_once_t Singleton<T>::ponce_=PTHREAD_ONCE_INIT;//Linux下初始化为0;
    
    template <class T>
    T* Singleton<T>::value_=NULL;
    

    二、双重检查加锁法

    class Singleton
    {
    public:
    	static Singleton *GetInstance()
    	{
    		if (m_Instance == NULL )
    		{
    			Lock lock; // Lock为管理相互排斥锁的资源类,会在该函数退出时自己主动释放
    			if (m_Instance == NULL )
    			{
    				m_Instance = new Singleton ();
    			}
    			
    		}
    		return m_Instance;
    	}
    
    	static void DestoryInstance()
    	{
    		if (m_Instance != NULL )
    		{
    			delete m_Instance;
    			m_Instance = NULL ;
    		}
    	}
    
    	int GetTest()
    	{
    		return m_Test;
    	}
    
    private:
    	Singleton(){ m_Test = 0; }
    	static Singleton *m_Instance;
    	int m_Test;
    };
    
    Singleton *Singleton ::m_Instance = NULL;

    双重检查加锁的优势在于:

    (1)没有实例化Singleton时,全部调用静态函数GetInstance的线程都会堵塞在lock上,仅仅有第一个调用者能获取该lock,实例化该类。

    (2)已经实例化Singleton时。全部调用者线程就不用排队获取lock。直接获取实例化对象

  • 相关阅读:
    SpringBoot通过注解获取接口信息
    2.2.0Nginx代理与负载均衡
    1.1Nginx概述
    Nginx安装整合
    每日日报27
    PHP所遇问题——注意:未定义的索引
    每日日报26
    每日日报25
    每日日报24
    每日日报23
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6794644.html
Copyright © 2011-2022 走看看