<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      單例模式

      什么是單例模式?

      單例模式屬于簡單設計模式的一種。在整個系統(tǒng)的生命周期內(nèi),單例類有且只有唯一一個對象,典型的應用比如日志的句柄。使用單例模式時需要考慮線程安全的問題,具體看后文具體的代碼解析。

      單例模式的特點

      • 單例類只能有一個實例。
      • 成員是私有的、靜態(tài)的。
      • 禁止拷貝、賦值,構造函數(shù)、私有函數(shù)是私有的。

      單例模式的實現(xiàn)方式

      • 懶漢模式:在需要使用的時候才實例化對象。
      • 餓漢模式:在系統(tǒng)剛啟動時就實例化對象。

      懶漢模式

      實現(xiàn)一(非線程安全)

      #include <iostream>
      #include <array>
      #include <thread>
      #include <mutex>
      
      #define MAX_THREAD_SIZE 10
      
      class Singleton
      {
      public:
          static Singleton* GetInstance();
          static void DeleteInstance();
          void Print(int index);
      
          Singleton(const Singleton& kSingleton) = delete;
          Singleton* operator=(const Singleton& kSingleton) = delete;
      private:
          Singleton();
          ~Singleton();
      
          static Singleton* singleton_;
      };
      
      Singleton::Singleton()
      {
          std::cout << "構造函數(shù)" << std::endl;
      }
      
      Singleton::~Singleton()
      {
          std::cout << "析構函數(shù)" << std::endl;
      }
      
      Singleton* Singleton::GetInstance()
      {
          if (!singleton_)
          {
              singleton_ = new(std::nothrow) Singleton;
          }
          
          return singleton_;
      }
      
      void Singleton::DeleteInstance()
      {
          if (singleton_)
          {
              delete singleton_;
              singleton_ = nullptr;
          }
      }
      
      void Singleton::Print(int index)
      {
          std::cout << "線程" << index << ":" << this << std::endl;
      }
      
      Singleton* Singleton::singleton_ = nullptr;
      
      int main()
      {
          std::array<std::thread, MAX_THREAD_SIZE> threads;
         
          for (int i = 0; i < MAX_THREAD_SIZE; i++)
          {
              threads[i] = std::thread(&Singleton::Print, Singleton::GetInstance(), i);
              threads[i].join();
          }
      
          Singleton::DeleteInstance();
      
          return 0;
      }
      

      此種實現(xiàn)方式,可能會有兩個線程同時進入GetInstance()函數(shù),恰好同時判斷出singleton_指針為空,各自new了一個Singleton對象,所以是非線程安全的,如果想要此種實現(xiàn)是線程安全的,那么對GetInstance()實現(xiàn)加上鎖保護即可,詳見實現(xiàn)二。

      實現(xiàn)二(線程安全)

      #include <iostream>
      #include <array>
      #include <thread>
      #include <mutex>
      
      #define MAX_THREAD_SIZE 10
      
      class Singleton
      {
      public:
          static Singleton* GetInstance();
          static void DeleteInstance();
          void Print(int index);
      
          Singleton(const Singleton& kSingleton) = delete;
          Singleton* operator=(const Singleton& kSingleton) = delete;
      private:
          Singleton();
          ~Singleton();
      
          static Singleton* singleton_;
          static std::mutex mutex_;
      };
      
      Singleton::Singleton()
      {
          std::cout << "構造函數(shù)" << std::endl;
      }
      
      Singleton::~Singleton()
      {
          std::cout << "析構函數(shù)" << std::endl;
      }
      
      Singleton* Singleton::GetInstance()
      {
          if (!singleton_)
          {
              std::unique_lock<std::mutex> lock(mutex_);
              if (!singleton_)
              {
                  singleton_ = new(std::nothrow) Singleton;
              }
          }
          
          return singleton_;
      }
      
      void Singleton::DeleteInstance()
      {
          std::unique_lock<std::mutex> lock(mutex_);
          if (singleton_)
          {
              delete singleton_;
              singleton_ = nullptr;
          }
      }
      
      void Singleton::Print(int index)
      {
          std::cout << "線程" << index << ":" << this << std::endl;
      }
      
      Singleton* Singleton::singleton_ = nullptr;
      std::mutex Singleton::mutex_;
      
      int main()
      {
          std::array<std::thread, MAX_THREAD_SIZE> threads;
         
          for (int i = 0; i < MAX_THREAD_SIZE; i++)
          {
              threads[i] = std::thread(&Singleton::Print, Singleton::GetInstance(), i);
              threads[i].join();
          }
      
          Singleton::DeleteInstance();
      
          return 0;
      }
      

      通過在GetInstance()函數(shù)中添加鎖的保護,可以保證有且只有一個線程進入并創(chuàng)建了Singleton類對象,從而保證了線程安全,但是多了鎖的開銷,那么有沒有更好的方法呢?下面介紹C++11后最推薦的方式。

      實現(xiàn)三(線程安全、推薦)

      #include <iostream>
      #include <array>
      #include <thread>
      #include <mutex>
      
      #define MAX_THREAD_SIZE 10
      
      class Singleton
      {
      public:
          static Singleton& GetInstance();
          void Print(int index);
      
          Singleton(const Singleton& kSingleton) = delete;
          Singleton& operator=(const Singleton& kSingleton)= delete;
      private:
          Singleton();
          ~Singleton();
      };
      
      Singleton::Singleton()
      {
          std::cout << "構造函數(shù)" << std::endl;
      }
      
      Singleton::~Singleton()
      {
          std::cout << "析構函數(shù)" << std::endl;
      }
      
      Singleton& Singleton::GetInstance()
      {
          static Singleton singleton_;
          return singleton_;
      }
      
      void Singleton::Print(int index)
      {
          std::cout << "線程"  << index << ":" << this << std::endl;
      }
      
      int main()
      {
          std::array<std::thread, MAX_THREAD_SIZE> threads;
         
          for (int i = 0; i < MAX_THREAD_SIZE; i++)
          {
              threads[i] = std::thread(&Singleton::Print, &Singleton::GetInstance(), i);
              threads[i].join();
          }
      
          return 0;
      }
      

      此種實現(xiàn)適用于C++11之后的程序,因為C++11規(guī)定:如果當變量在初始化的時候,并發(fā)同時進入聲明語句,并發(fā)線程將會阻塞等待初始化結束。 這種返回局部靜態(tài)變量的方式,更加的簡潔高效,所以比較推薦。

      餓漢模式

      #include <iostream>
      #include <array>
      #include <thread>
      #include <mutex>
      
      #define MAX_THREAD_SIZE 10
      
      class Singleton
      {
      public:
          static Singleton* GetInstance();
          static void DeleteInstance();
          void Print(int index);
      
          Singleton(const Singleton& kSingleton) = delete;
          Singleton& operator=(const Singleton& kSingleton) = delete;
      private:
          Singleton();
          ~Singleton();
      
          static Singleton* singleton_;
      };
      
      Singleton::Singleton()
      {
          std::cout << "構造函數(shù)" << std::endl;
      }
      
      Singleton::~Singleton()
      {
          std::cout << "析構函數(shù)" << std::endl;
      }
      
      Singleton* Singleton::GetInstance()
      {
          return singleton_;
      }
      
      void Singleton::DeleteInstance()
      {
          if (singleton_)
          {
             delete singleton_;
             singleton_ = nullptr; 
          }
      }
      
      void Singleton::Print(int index)
      {
          std::cout << "線程" << index << ":" << this << std::endl;
      }
      
      Singleton* Singleton::singleton_ = new(std::nothrow) Singleton;
      
      int main()
      {
          std::array<std::thread, MAX_THREAD_SIZE> threads;
         
          for (int i = 0; i < MAX_THREAD_SIZE; i++)
          {
              threads[i] = std::thread(&Singleton::Print, Singleton::GetInstance(), i);
              threads[i].join();
          }
      
          Singleton::DeleteInstance();
      
          return 0;
      }
      

      餓漢模式的實現(xiàn),在程序啟動時,就已經(jīng)實例化了Singleton對象,因此,后續(xù)訪問的都是同一個對象,是天然的線程安全的。

      總結

      單例模式是一種比較經(jīng)典、常用的設計模式,面試也經(jīng)常會問到,是一定要掌握的。如果在程序中需要創(chuàng)建一個唯一存在的實例對象,那么一定要考慮使用單例模式,優(yōu)先使用懶漢模式中的返回局部靜態(tài)變量的方法,切記保證線程安全。

      posted @ 2024-07-28 23:15  今天你自律了沒  閱讀(111)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲一区二区精品偷拍| 亚洲一区二区三区四区| 亚洲区一区二区激情文学| 色偷偷中文在线天堂中文| 波多野结衣久久一区二区| 成全高清在线播放电视剧| 九九热在线观看免费视频| 亚洲狠狠婷婷综合久久久| 蜜桃av无码免费看永久| 国产精品伊人久久综合网| 亚洲精品香蕉一区二区| 亚洲精品久久久久玩吗| 人妻系列无码专区无码中出| 熟女精品国产一区二区三区| 大地资源中文第二页日本| 张掖市| 亚洲精品无码av天堂| 亚洲香蕉免费有线视频| 亚洲色成人网站www永久| av色蜜桃一区二区三区| 特级av毛片免费观看| 综合色一色综合久久网| 亚洲精品网站在线观看不卡无广告 | 林西县| 免费无遮挡无码视频网站| 福利一区二区在线视频| 老熟女高潮一区二区三区| 九九热精品在线视频免费| 中国CHINA体内裑精亚洲日本| 香蕉EEWW99国产精选免费| 亚洲一二三四区中文字幕| 国产无遮挡无码视频在线观看| 99久久久无码国产麻豆| 深圳市| 最新国产AV最新国产在钱| 亚洲欧美牲交| 久久香蕉欧美精品| 亚洲经典在线中文字幕 | 亚洲国产中文字幕精品| 天天躁夜夜躁狠狠综合| 国产自产一区二区三区视频|