C++-饿汉式声明(单例声明)和懒汉式声明(单例声明 线程thread)

饿汉式声明, 一开始的时候对单例进行声明

复制代码
#include <iostream>

using namespace std; 

class Singleton{ 
public:
    static Singleton& getInstance(void){
        return s_instance;
    }
    void print(void) {
        cout<<m_data<<endl;
    }

private:
    Singleton(int data = 0):m_data(data){
        cout << "单例被创建" << endl;     
    }; 
    Singleton(const Singleton&); 
    int m_data; 
    static Singleton s_instance; 
}; 

Singleton Singleton::s_instance = 123; 

int main(void){
    Singleton& s1 = Singleton::getInstance(); 
    Singleton& s2 = Singleton::getInstance(); 
    Singleton& s3 = Singleton::getInstance(); 
    
    cout << &s1 << endl; 
    cout << &s2 << endl; 
    cout << &s3 << endl; 
    return 0; 
}
复制代码

懒汉式声明, 在进行调用的时候进行声明,这里使用了线程里的互斥锁

复制代码
#include <iostream>

using namespace std; 


class Singleton{
public:
    static Singleton& getInstance(void){
        pthread_mutex_lock(&mutex);
        if(s_instance == NULL){
            s_instance = new Singleton(123);          
        }
        ++s_count; 
        pthread_mutex_unlock(&mutex); 
        return *s_instance;
    }
    //所有的使用者都不用再销毁 
    void release(void) {
        pthread_mutex_lock(&mutex); 
        if (--s_count == 0){
            delete s_instance;
            s_instance = NULL; 
        }  
        pthread_mutex_unlock(&mutex); 
    }
    //单列对象不用销毁 
    void print(void) {
        cout << m_data << endl; 
    }
private:
    Singleton(int data=0):m_data(data){
        cout << "创建单例" << endl; 
    } 
    Singleton(const Singleton&); 
    ~Singleton(void){
        cout << "单例被删除" << endl; 
    }
    int m_data; 
    static Singleton* s_instance; 
    static int s_count; 
    static pthread_mutex_t mutex;  
};     

Singleton* Singleton::s_instance = NULL;//进行私有化的生成操作 
int Singleton::s_count = 0;
//互斥锁定义和初始化  
pthread_mutex_t Singleton::mutex = PTHREAD_MUTEX_INITIALIZER; 

int main() {
    Singleton& s1 = Singleton::getInstance(); 
    Singleton& s2 = Singleton::getInstance(); 
    Singleton& s3 = Singleton::getInstance(); 
    
    cout << "&s1" << &s1 << endl; 
    cout << "&s2" << &s2 << endl; 
    cout << "&s3" << &s3 << endl; 
    
    s1.print(); 
    s1.release(); 
    
    s2.print(); 
    s2.release(); 
    
    s3.print(); 
    s3.release(); 

}
复制代码

 

posted @   c语言我的最爱  阅读(249)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示