IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 单例模式详解(线程安全,饿汉,懒汉模式) -> 正文阅读

[C++知识库]单例模式详解(线程安全,饿汉,懒汉模式)

单例模式

创建唯一的一个变量(对象),在类中将构造函数设为protected或者private(析构函数设为相对应的访问权限),故外部不能实例化对象再提供访问它的一个全局访问点,即定义一个static函数,返回类中唯一构造的一个实例对象。任何条件下,保证只有一个实例对象,这就是单例。

  1. 线程安全:在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
  2. 懒汉模式:在系统运行中,实例并不存在,只有当需要的时候才创建并使用实例。(需要考虑线程安全)可以使用静态局部变量(c++11及以上)或者需要加锁。
//如果是多线程 需要加锁
class MultiThreadSingleton
{
public:
    ~MultiThreadSingleton()
    {
        cout << "~MultiThreadSingleton()" << endl;
    }   
    static MultiThreadSingleton* getInstance()
    {
        if(instance == nullptr)
        {
            //初次创建时加锁
            pthread_mutex_lock(&mutex);

            instance = new MultiThreadSingleton();

            pthread_mutex_unlock(&mutex);
        }

        return instance;
    }

    void SingletonOP()
    {
        cout << "SingletonOP!" << endl;
    }

private:
    MultiThreadSingleton()
    {
        pthread_mutex_init(&mutex,NULL);
        cout << "MultiThreadSingleton()" << endl;
    }
    static pthread_mutex_t mutex;
    static MultiThreadSingleton* instance;
};

//懒汉模式  即需要的时候才去实例化对象
MultiThreadSingleton*  MultiThreadSingleton::instance = nullptr;
pthread_mutex_t MultiThreadSingleton::mutex;

//------------
MultiThreadSingleton* sig3 = MultiThreadSingleton::getInstance();
sig3->SingletonOP();
delete sig3;
//局部变量懒汉模式
static MultiThreadSingleton* getInstance()
{
     //局部变量
     static MultiThreadSingleton localInstance;
     return &localInstance;
}
    
//-----------------------------
//懒汉局部变量
 MultiThreadSingleton* sig4 = MultiThreadSingleton::getInstance();
 MultiThreadSingleton* sig5 = MultiThreadSingleton::getInstance();
 sig4->SingletonOP();
 if(sig4 == sig5) cout << "Test!" << endl;
  1. 饿汉模式:指系统一运行,就初始化创建实例,当需要的时候,直接调用就行。(本身就是线程安全)
    • 二者的主要区别就是创建实例的时间不同
    • 使用懒汉单例时,推荐使用内部静态变量的懒汉单例,代码量少
    • 懒汉式是空间换时间,适应于访问量较少;饿汉式是时间换空间,适应于访问量较大或者线程较多时。
class MultiThreadSingleton
{
public:
    ~MultiThreadSingleton()
    {
        cout << "~MultiThreadSingleton()" << endl;
    }   
    static MultiThreadSingleton* getInstance()
    {
        // if(instance == nullptr)
        // {
        //     return new MultiThreadSingleton();
        // }

        return instance;
    }

    void SingletonOP()
    {
        cout << "SingletonOP!" << endl;
    }

private:
    MultiThreadSingleton()
    {
        cout << "MultiThreadSingleton()" << endl;
    }
    
    static MultiThreadSingleton* instance;


};
//饿汉模式  即在类加载时时就创建对象,适合访问量较大的时候,用空间换时间
MultiThreadSingleton*  MultiThreadSingleton::instance = new MultiThreadSingleton();
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:23:18  更:2022-02-22 20:24:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:27:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码