zoukankan      html  css  js  c++  java
  • 单例模式

    单例实现方式一:懒汉模式

     1 // 单例:懒汉模式,即在使用的时候才会创建实例对象。
     2 // 懒汉模式存在线程安全的问题,当对象没有被创建的时候,多个线程同时访问,则会出现多个线程创建实例对象的问题,需要加锁
     3 #include<mutex>
     4 #include<iostream>
     5 #include<cstdlib>
     6 using namespace std;
     7 
     8 mutex my_mutex;
     9 
    10 class Test
    11 {
    12 public:
    13     ~Test();
    14     // 获取实例对象
    15     static Test* getInstance();
    16 private:
    17     Test();
    18     Test(const Test& t);
    19     // 单一的实例对象,
    20     static Test* t; // 指针,没有初始化
    21 };
    22 // 类外初始化
    23 Test* Test::t = NULL;
    24 
    25 Test::Test()
    26 {
    27 }
    28 
    29 Test::Test(const Test& t)
    30 {
    31 }
    32 
    33 Test::~Test()
    34 {
    35 }
    36 
    37 Test* Test::getInstance()
    38 {
    39     // 多线程同时访问的时候, 就会发生多个线程创建实例对象的线程安全问题
    40     // 使用互斥锁
    41     if (t == NULL)
    42     {
    43         my_mutex.lock();
    44         if (t == NULL)
    45         {
    46             // 创建
    47             t = new Test;
    48         }
    49         my_mutex.unlock();
    50     }
    51     return t;
    52 }
    53 
    54 int main()
    55 {
    56     Test *t1 = Test::getInstance();
    57     Test* t2 = Test::getInstance();
    58     cout << t1 << endl;
    59     cout << t2 << endl;
    60     system("pause");
    61     return EXIT_SUCCESS;
    62 }

    单例实现方式二:饿汉模式,实例对象被使用之前就已经被创建,不存在线程安全问题。

    饿汉模式实现一:

     1 // 饿汉模式一:实例对象在使用之前就已经被创建
     2 #include<cstdlib>
     3 #include<iostream>
     4 using namespace std;
     5 class MyTest2
     6 {
     7 public:
     8     ~MyTest2();
     9     static MyTest2* getInstance();
    10 private:
    11     MyTest2();
    12     MyTest2(const MyTest2& t);
    13     static MyTest2 m_t;
    14 };
    15 MyTest2 MyTest2::m_t;
    16 
    17 MyTest2::MyTest2()
    18 {
    19 }
    20 
    21 MyTest2::MyTest2(const MyTest2& t)
    22 {
    23 }
    24 
    25 MyTest2::~MyTest2()
    26 {
    27 }
    28 MyTest2* MyTest2::getInstance()
    29 {
    30     return &m_t;
    31 }
    32 
    33 int main()
    34 {
    35     MyTest2 *t1 = MyTest2::getInstance();
    36     cout << t1 << endl;
    37     MyTest2* t2 = MyTest2::getInstance();
    38     cout << t2 << endl;
    39     system("pause");
    40     return EXIT_SUCCESS;
    41 }

    饿汉模式实现二:

     1 // 饿汉模式:实例对象在使用之前就已经被创建
     2 #include<cstdlib>
     3 #include<iostream>
     4 using namespace std;
     5 class MyTest3
     6 {
     7 public:
     8     ~MyTest3();
     9     static MyTest3* getInstance();
    10 private:
    11     MyTest3();
    12     MyTest3(const MyTest3& t);
    13     static MyTest3 *m_tt;
    14 };
    15 MyTest3* MyTest3::m_tt = new MyTest3;
    16 
    17 MyTest3::MyTest3()
    18 {
    19 }
    20 
    21 MyTest3::MyTest3(const MyTest3& t)
    22 {
    23 }
    24 
    25 MyTest3::~MyTest3()
    26 {
    27 }
    28 MyTest3* MyTest3::getInstance()
    29 {
    30     return m_tt;
    31 }
    32 
    33 int main()
    34 {
    35     MyTest3* t1 = MyTest3::getInstance();
    36     cout << t1 << endl;
    37     MyTest3* t2 = MyTest3::getInstance();
    38     cout << t2 << endl;
    39     system("pause");
    40     return EXIT_SUCCESS;
    41 }

    单例实现方式三:使用静态局部变量方式实现,该方式只有支持C++11标准才行。

     1 // C++11新特性,使用静态局部变量实现
     2 #include<cstdlib>
     3 #include<iostream>
     4 using namespace std;
     5 class MyTest1
     6 {
     7 public:
     8     ~MyTest1();
     9     static MyTest1* getInstance();
    10 private:
    11     MyTest1();
    12     MyTest1(const MyTest1& myt);
    13 };
    14 
    15 MyTest1::MyTest1()
    16 {
    17 }
    18 
    19 MyTest1::MyTest1(const MyTest1& myt)
    20 {
    21 }
    22 
    23 MyTest1::~MyTest1()
    24 {
    25 }
    26 
    27 MyTest1* MyTest1::getInstance()
    28 {
    29     // 线程安全, 并且只会被初始化一次
    30     static MyTest1* t = new MyTest1;
    31     return t;
    32 }
    33 int main()
    34 {
    35     MyTest1* t1 = MyTest1::getInstance();
    36     cout << t1 << endl;
    37     MyTest1* t2 = MyTest1::getInstance();
    38     cout << t2 << endl;
    39     system("pause");
    40     return EXIT_SUCCESS;
    41 }
  • 相关阅读:
    Linux 文件取交集 并集 差集
    阿里花名推荐
    Linux bg fg命令的使用
    python导入自己创建的本地包报错
    数值计算方法
    数据库oracle回顾
    使用visualBox创建Centos/7,搭建docker,安装mysql,及远程连接
    git 合并分支到master
    git 本地文件修改错误,重新取回服务器历史版本
    三本不错的计算机专业书籍(需求分析,开发实务,恶意代码分析)
  • 原文地址:https://www.cnblogs.com/qingpeng/p/13546989.html
Copyright © 2011-2022 走看看