日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【C++】C/C++ 中的单例模式

發布時間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++】C/C++ 中的单例模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

part 0:單例模式3種經典的實現方式

Meyer's Singleton

Meyers Singleton版本二

Lazy Singleton

Eager Singleton

Testing

part 1:C++之單例模式

動機

實現一[線程不安全版本]

實現二[線程安全,鎖的代價過高]

鎖機制

實現三[雙檢查鎖,由于內存讀寫reoder導致不安全]

實現四[C++ 11版本的跨平臺實現]

實現五[pthread_once函數]

另外一個版本實現std::call_once & std::once_flag

實現六[c++ 11版本最簡潔的跨平臺方案]

用模板包裝單例

總結

part 2:單例模式

1.傳統的單例模式實現

part 3:java之單例模式

介紹

實現

步驟 1

SingleObject.java

步驟 2

SingletonPatternDemo.java

步驟 3

單例模式的幾種實現方式

1、懶漢式,線程不安全

實例

2、懶漢式,線程安全

實例

3、餓漢式

實例

4、雙檢鎖/雙重校驗鎖(DCL,即 double-checked locking)

實例

5、登記式/靜態內部類

實例

6、枚舉

實例


part 0:單例模式3種經典的實現方式

單例模式是一種創建型的設計模式(creational design patterns),使用單例模式進行設計的類在程序中只擁有一個實例(single instance),這個類稱為單例類,它會提供一個全局的訪問入口(global access point),關于單例模式的討論可以參考Singleton revisited;基于這兩個特點,單例模式可以有以下幾種實現:

Meyer's Singleton

Scott MeyersEffective C++Item 4: Make sure that objects are initialized before they're used 里面提出了一種利用 C++ 的 static 關鍵字來實現的單例模式,這種實現非常簡潔高效,它的特點是:

  1. 僅當程序第一次執行到 GetInstance 函數時,執行 instance 對象的初始化;

  2. 在 C++ 11 之后,被 static 修飾的變量可以保證是線程安全的;

    template<typename T>
    class Singleton
    {
    public:static T& GetInstance(){static T instance;return instance;}
    ?Singleton(T&&) = delete;Singleton(const T&) = delete;void operator= (const T&) = delete;
    ?
    protected:Singleton() = default;virtual ~Singleton() = default;
    };

    通過禁用單例類的 copy constructor,move constructor 和 operator= 可以防止類的唯一實例被拷貝或移動;不暴露單例類的 constructor 和 destructor 可以保證單例類不會通過其他途徑被實例化,同時將兩者定義為 protected 可以讓其被子類繼承并使用。

    Meyers Singleton版本二

    Meyers Singleton的實現方式基于"static variables with block scope"的自動線程安全特性,非常簡單易懂。

    class MeyersSingleton{
    public:static MySingleton& getInstance(){static MySingleton instance;// volatile int dummy{};return instance;}
    private:MySingleton()= default;~MySingleton()= default;MySingleton(const MySingleton&)= delete;MySingleton& operator=(const MySingleton&)= delete;
    };

    Lazy Singleton

    Lazy Singleton 是一種比較傳統的實現方法,通過其名字可以看出來它也具有 lazy-evaluation 的特點,但在實現的時候需要考慮線程安全的問題:

    template<typename T, bool is_thread_safe = true>
    class LazySingleton
    {
    private:static unique_ptr<T> t_;static mutex mtx_;
    ?
    public:static T& GetInstance(){if (is_thread_safe == false){if (t_ == nullptr)t_ = unique_ptr<T>(new T);return *t_;}
    ?if (t_ == nullptr){unique_lock<mutex> unique_locker(mtx_);if (t_ == nullptr)t_ = unique_ptr<T>(new T);return *t_;}
    ?}
    ?LazySingleton(T&&) = delete;LazySingleton(const T&) = delete;void operator= (const T&) = delete;
    ?
    protected:LazySingleton() = default;virtual ~LazySingleton() = default;
    };
    ?
    template<typename T, bool is_thread_safe>
    unique_ptr<T> LazySingleton<T, is_thread_safe>::t_;
    ?
    template<typename T, bool is_thread_safe>
    mutex LazySingleton<T, is_thread_safe>::mtx_;

    我們通過模板參數 is_thread_safe 來控制這個類是否是線程安全的,因為在某些場景下我們會希望每個線程擁有一個實例:

    1. is_thread_safe == false,即非線程安全時,我們在 GetInstance 函數中直接判斷,初始化并返回單例對象;這里使用了 unique_ptr 防止線程銷毀時發生內存泄漏,也可以在析構函數中銷毀指針;

    2. is_thread_safe == true 時,我們通過 double-checked locking 來進行檢查并加鎖,防止單例類在每個線程上都被實例化。

    Eager Singleton

    和 Lazy Singleton 相反,Eager Singleton 利用 static member variable 的特性,在程序進入 main 函數之前進行初始化,這樣就繞開了線程安全的問題:

    template<typename T>
    class EagerSingleton
    {
    private:static T* t_;
    ?
    public:static T& GetInstance(){return *t_;}
    ?EagerSingleton(T&&) = delete;EagerSingleton(const T&) = delete;void operator= (const T&) = delete;
    ?
    protected:EagerSingleton() = default;virtual ~EagerSingleton() = default;
    };
    ?
    template<typename T>
    T* EagerSingleton<T>::t_ = new (std::nothrow) T;

    但是它也有兩個問題:

    1. 即使單例對象不被使用,單例類對象也會進行初始化;

    2. static initialization order fiasco,即 t_ 對象和 GetInstance 函數的初始化先后順序是不固定的;

      Testing

      將上面實現的四種 Singleton 分別繼承下來作為 functor 傳入線程對象進行測試:

      class Foo : public Singleton<Foo>
      {
      public:void operator() (){cout << &GetInstance() << endl;}
      };
      ?
      class LazyFoo : public LazySingleton<LazyFoo, false>
      {
      public:void operator() (){cout << &GetInstance() << endl;}
      };
      ?
      class ThreadSafeLazyFoo : public LazySingleton<ThreadSafeLazyFoo>
      {
      public:void operator() (){cout << &GetInstance() << endl;}
      };
      ?
      class EagerFoo : public EagerSingleton<EagerFoo>
      {
      public:void operator() (){cout << &GetInstance() << endl;}
      };
      ?
      void SingletonTest()
      {thread t1((Foo()));thread t2((Foo()));t1.join();t2.join();this_thread::sleep_for(chrono::milliseconds(100));
      ?t1 = thread((LazyFoo()));t2 = thread((LazyFoo()));t1.join();t2.join();this_thread::sleep_for(chrono::milliseconds(100));
      ?t1 = thread((ThreadSafeLazyFoo()));t2 = thread((ThreadSafeLazyFoo()));t1.join();t2.join();this_thread::sleep_for(chrono::milliseconds(100));
      ?t1 = thread((EagerFoo()));t2 = thread((EagerFoo()));t1.join();t2.join();
      }

      輸出結果為:

      0x60d110
      0x60d110
      0x7f92380008c0
      0x7f92300008c0
      0x7f92300008e0
      0x7f92300008e0
      0x1132010
      0x1132010

      可以看到只有第二組非線程安全的 LazySingleton 在兩個線程中輸出的實例地址是不同的,其它的 Singleton 均是線程安全的。

part 1:C++之單例模式

動機

保證一個類僅有一個實例,并提供一個該實例的全局訪問點。 ——《設計模式》GoF

在軟件系統中,經常有這樣一些特殊的類,必須保證他們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。

所以得考慮如何繞過常規的構造器(不允許使用者new出一個對象),提供一種機制來保證一個類只有一個實例。

應用場景:

  • Windows的Task Manager(任務管理器)就是很典型的單例模式,你不能同時打開兩個任務管理器。Windows的回收站也是同理。

  • 如連接池、類工廠、文件系統等。這就是設計模式中的單例模式(Singleton Pattern)。

  • 應用程序的日志應用,一般都可以用單例模式實現,只能有一個實例去操作文件。

  • 讀取配置文件,讀取的配置項是公有的,一個地方讀取了所有地方都能用,沒有必要所有的地方都能讀取一遍配置。

  • 數據庫連接池,多線程的線程池。

    實現一[線程不安全版本]

    class Singleton{
    public:static Singleton* getInstance(){// 先檢查對象是否存在if (m_instance == nullptr) {m_instance = new Singleton();}return m_instance;}
    private:Singleton(); //私有構造函數,不允許使用者自己生成對象Singleton(const Singleton& other);static Singleton* m_instance; //靜態成員變量 
    };
    ?
    Singleton* Singleton::m_instance=nullptr; //靜態成員需要先初始化

    這是單例模式最經典的實現方式,將構造函數和拷貝構造函數都設為私有的,而且采用了延遲初始化的方式,在第一次調用getInstance()的時候才會生成對象,不調用就不會生成對象,不占據內存。然而,在多線程的情況下,這種方法是不安全的。

    分析:正常情況下,如果線程A調用getInstance()時,將m_instance 初始化了,那么線程B再調用getInstance()時,就不會再執行new了,直接返回之前構造好的對象。然而存在這種情況,線程A執行m_instance = new Singleton()還沒完成,這個時候m_instance仍然為nullptr,線程B也正在執行m_instance = new Singleton(),這是就會產生兩個對象,線程AB可能使用的是同一個對象,也可能是兩個對象,這樣就可能導致程序錯誤,同時,還會發生內存泄漏。

    實現二[線程安全,鎖的代價過高]

    //線程安全版本,但鎖的代價過高
    Singleton* Singleton::getInstance() {Lock lock; //偽代碼 加鎖if (m_instance == nullptr) {m_instance = new Singleton();}return m_instance;
    }

    分析:這種寫法不會出現上面兩個線程都執行new的情況,當線程A在執行m_instance = new Singleton()的時候,線程B如果調用了getInstance(),一定會被阻塞在加鎖處,等待線程A執行結束后釋放這個鎖。從而是線程安全的。

    但這種寫法的性能不高,因為每次調用getInstance()都會加鎖釋放鎖,而這個步驟只有在第一次new Singleton()才是有必要的,只要m_instance被創建出來了,不管多少線程同時訪問,使用if (m_instance == nullptr)進行判斷都是足夠的(只是讀操作,不需要加鎖),沒有線程安全問題,加了鎖之后反而存在性能問題。

    鎖機制

    std::mutex myMutex;
    ?
    class MySingleton{
    public:static MySingleton& getInstance(){std::lock_guard<std::mutex> myLock(myMutex);if ( !instance ){instance= new MySingleton();}// volatile int dummy{};return *instance;}
    private:MySingleton()= default;~MySingleton()= default;MySingleton(const MySingleton&)= delete;MySingleton& operator=(const MySingleton&)= delete;
    ?static MySingleton* instance;
    };
    ?
    ?
    MySingleton* MySingleton::instance= nullptr;

    每次getInstance方法調用,都需要申請和釋放鎖,開銷非常大。

    實現三[雙檢查鎖,由于內存讀寫reoder導致不安全]

    上面的做法是不管三七二十一,某個線程要訪問的時候,先鎖上再說,這樣會導致不必要的鎖的消耗,那么,是否可以先判斷下if (m_instance == nullptr)呢,如果滿足,說明根本不需要鎖啊!這就是所謂的雙檢查鎖(DCL)的思想,DCL即double-checked locking。

    //雙檢查鎖,但由于內存讀寫reorder不安全
    Singleton* Singleton::getInstance() {//先判斷是不是初始化了,如果初始化過,就再也不會使用鎖了if(m_instance==nullptr){Lock lock; //偽代碼if (m_instance == nullptr) {m_instance = new Singleton();}}return m_instance;
    }

    這樣看起來很棒!只有在第一次必要的時候才會使用鎖,之后就和實現一中一樣了。

    在相當長的一段時間,迷惑了很多人,在2000年的時候才被人發現漏洞,而且在每種語言上都發現了。原因是內存讀寫的亂序執行(編譯器的問題)。

    分析:m_instance = new Singleton()這句話可以分成三個步驟來執行:

    1. 分配了一個Singleton類型對象所需要的內存。

    2. 在分配的內存處構造Singleton類型的對象。

    3. 把分配的內存的地址賦給指針m_instance

    可能會認為這三個步驟是按順序執行的,但實際上只能確定步驟1是最先執行的,步驟23卻不一定。問題就出現在這。假如某個線程A在調用執行m_instance = new Singleton()的時候是按照1,3,2的順序的,那么剛剛執行完步驟3Singleton類型分配了內存(此時m_instance就不是nullptr了)就切換到了線程B,由于m_instance已經不是nullptr了,所以線程B會直接執行return m_instance得到一個對象,而這個對象并沒有真正的被構造!!嚴重bug就這么發生了。

    實現四[C++ 11版本的跨平臺實現]

    javac#發現這個問題后,就加了一個關鍵字volatile,在聲明m_instance變量的時候,要加上volatile修飾,編譯器看到之后,就知道這個地方不能夠reorder(一定要先分配內存,在執行構造器,都完成之后再賦值)。

    而對于c++標準卻一直沒有改正,所以VC++2005版本也加入了這個關鍵字,但是這并不能夠跨平臺(只支持微軟平臺)。

    而到了c++ 11版本,終于有了這樣的機制幫助我們實現跨平臺的方案。

    //C++ 11版本之后的跨平臺實現 
    // atomic c++11中提供的原子操作
    std::atomic<Singleton*> Singleton::m_instance;
    std::mutex Singleton::m_mutex;
    ?
    /*
    * std::atomic_thread_fence(std::memory_order_acquire); 
    * std::atomic_thread_fence(std::memory_order_release);
    * 這兩句話可以保證他們之間的語句不會發生亂序執行。
    */
    Singleton* Singleton::getInstance() {Singleton* tmp = m_instance.load(std::memory_order_relaxed);std::atomic_thread_fence(std::memory_order_acquire);//獲取內存fenceif (tmp == nullptr) {std::lock_guard<std::mutex> lock(m_mutex);tmp = m_instance.load(std::memory_order_relaxed);if (tmp == nullptr) {tmp = new Singleton;std::atomic_thread_fence(std::memory_order_release);//釋放內存fencem_instance.store(tmp, std::memory_order_relaxed);}}return tmp;
    }

    實現五[pthread_once函數]

    在linux中,pthread_once()函數可以保證某個函數只執行一次。

    聲明: int pthread_once(pthread_once_t once_control, void (init_routine) (void));
    ?
    功能: 本函數使用初值為PTHREAD_ONCE_INIT的once_control
    變量保證init_routine()函數在本進程執行序列中僅執行一次。 

    示例如下:

    class Singleton{
    public:static Singleton* getInstance(){// init函數只會執行一次pthread_once(&ponce_, &Singleton::init);return m_instance;}
    private:Singleton(); //私有構造函數,不允許使用者自己生成對象Singleton(const Singleton& other);//要寫成靜態方法的原因:類成員函數隱含傳遞this指針(第一個參數)static void init() {m_instance = new Singleton();}static pthread_once_t ponce_;static Singleton* m_instance; //靜態成員變量 
    };
    pthread_once_t Singleton::ponce_ = PTHREAD_ONCE_INIT;
    Singleton* Singleton::m_instance=nullptr; //靜態成員需要先初始化

    另外一個版本實現std::call_once & std::once_flag

    這種方式基于C++新特性,保證多線程下實例化方法只被調用一次。

    class CallOnceSingleton{
    public:static MySingleton& getInstance(){std::call_once(initInstanceFlag, &MySingleton::initSingleton);// volatile int dummy{};return *instance;}
    private:MySingleton()= default;~MySingleton()= default;MySingleton(const MySingleton&)= delete;MySingleton& operator=(const MySingleton&)= delete;static MySingleton* instance;static std::once_flag initInstanceFlag;static void initSingleton(){instance= new MySingleton;}
    };
    ?
    MySingleton* MySingleton::instance= nullptr;
    std::once_flag MySingleton::initInstanceFlag;

    實現六[c++ 11版本最簡潔的跨平臺方案]

    實現四的方案有點麻煩,實現五的方案不能跨平臺。其實c++ 11中已經提供了std::call_once方法來保證函數在多線程環境中只被調用一次,同樣,他也需要一個once_flag的參數。用法和pthread_once類似,并且支持跨平臺。

    實際上,還有一種最為簡單的方案!

    在C++memory model中對static local variable,說道:The initialization of such a variable is defined to occur the first time control passes through its declaration; for multiple threads calling the function, this means there’s the potential for a race condition to define first.

    局部靜態變量不僅只會初始化一次,而且還是線程安全的。

    class Singleton{
    public:// 注意返回的是引用。static Singleton& getInstance(){static Singleton m_instance;  //局部靜態變量return m_instance;}
    private:Singleton(); //私有構造函數,不允許使用者自己生成對象Singleton(const Singleton& other);
    };

    這種單例被稱為Meyers' Singleton。這種方法很簡潔,也很完美,但是注意:

    1. gcc 4.0之后的編譯器支持這種寫法。

    2. C++11及以后的版本(如C++14)的多線程下,正確。

    3. C++11之前不能這么寫。

    但是現在都18年了。。新項目一般都支持了c++11了。

    用模板包裝單例

    從上面已經知道了單例模式的各種實現方式。但是有沒有感到一點不和諧的地方?如果我class A需要做成單例,需要這么改造class A,如果class B也需要做成單例,還是需要這樣改造一番,是不是有點重復勞動的感覺?利用c++的模板語法可以避免這樣的重復勞動。

    template<typename T>
    class Singleton
    {
    public:static T& getInstance() {static T value_; //靜態局部變量return value_;}
    ?
    private:Singleton();~Singleton();Singleton(const Singleton&); //拷貝構造函數Singleton& operator=(const Singleton&); // =運算符重載
    };

    假如有AB兩個類,用Singleton類可以很容易的把他們也包裝成單例。

    class A{
    public:A(){a = 1;}void func(){cout << "A.a = " << a << endl;}
    ?
    private:int a;
    };
    ?
    class B{
    public:B(){b = 2;}
    ?void func(){cout << "B.b = " << b << endl;}
    private:int b;
    };
    ?
    // 使用demo
    int main()
    {Singleton<A>::getInstance().func();Singleton<B>::getInstance().func();return 0;
    }

    假如類A的構造函數具有參數呢?上面的寫法還是沒有通用性。可以使用C++11的可變參數模板解決這個問題。但是感覺實際中這種需求并不是很多,因為構造只需要一次,每次getInstance()傳個參數不是很麻煩嗎。。。

    總結

    單例模式本身十分簡單,但是實現上卻發現各種麻煩,主要是多線程編程確實是個難點。而對于c++的對象模型、內存模型,并沒有什么深入的了解,還在一知半解的階段,仍需努力。

    需要注意的一點是,上面討論的線程安全指的是getInstance()是線程安全的,假如多個線程都獲取類A的對象,如果只是只讀操作,完全OK,但是如果有線程要修改,有線程要讀取,那么類A自身的函數需要自己加鎖防護,不是說線程安全的單例也能保證修改和讀取該對象自身的資源也是線程安全的。

    ?

part 2:單例模式

?

這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

注意:

  • 1、單例類只能有一個實例。

  • 2、單例類必須自己創建自己的唯一實例。

  • 3、單例類必須給所有其他對象提供這一實例。

1.傳統的單例模式實現

class Singleton
{
private:Singleton(){}
public:static Singleton* instance(){if(_instance == 0){_instance = new Singleton();}return _instance;}
private:static Singleton* _instance;public:int atestvalue;
};Singleton* Singleton::_instance = 0;

上面這種實現在單線程環境下是沒有問題的,可是多線程下就有問題了。

當:

  1. 例如線程A進入函數instance執行判斷語句,這句執行后就掛起了,這時線程A已經認為_instance為NULL,但是線程A還沒有創建singleton對象。

  2. 又有一個線程B進入函數instance執行判斷語句,此時同樣認為_instance變量為null,因為A沒有創建singleton對象。線程B繼續執行,創建了一個singleton對象。

  3. 稍后,線程A接著執行,也創建了一個新的singleton對象。

  4. 這時,單例就會同時創建2個對象。

    ?

針對上面的分析可以看出,需要對_instance變量加上互斥鎖:

Singleton* Singleton::instance() {Lock lock; // acquire lock (params omitted for simplicity)if (_instance == 0) {_instance = new Singleton;}return _instance;
} // release lock (via Lock destructor)

上鎖后是解決了線程安全問題,但是有些資源浪費。稍微分析一下:每次instance函數調用時候都需要請求加鎖,其實并不需要,instance函數只需第一次調用的時候上鎖就行了。這時可以用DCLP解決。

Singleton* Singleton::instance() {if (_instance == 0) { // 1st testLock lock;if (_instance == 0) { // 2nd test_instance = new Singleton;}}return _instance;
}

站在編譯器的角度關注下這句代碼的執行順序:

_instance  = new singleton()

為了執行這句代碼,機器需要做三樣事兒:

1.singleton對象分配空間。

2.在分配的空間中構造對象

3.使_instance指向分配的空間

遺憾的是編譯器并不是嚴格按照上面的順序來執行的。可以交換2和3.

將上面三個步驟標記到代碼中就是這樣:

Singleton* Singleton::instance() {if (_instance == 0) {Lock lock;if (_instance == 0) {_instance = // Step 3operator new(sizeof(Singleton)); // Step 1new (_instance) Singleton; // Step 2}}return _instance;
}

好了,緊張的時刻到了,如果發生下面兩件事:

線程A進入了instance函數,并且執行了step1和step3,然后掛起。這時的狀態是:instance不NULL,而instance指向的內存去沒有對象! 線程B進入了instance函數,發現_instance不為null,就直接return _instance了。 貌似這時無法解決的問題了,咋辦呢。搞嵌入式的程序員可能想到用c++中的volatile關鍵字。對,就是用volatile,但是用volatile就要一用到底,用了之后就是下面這種丑陋的代碼了。

class Singleton {
public:static volatile Singleton* volatile instance();
...
private:
// one more volatile addedstatic Singleton* volatile _instance;
};// from the implementation file
volatile Singleton* volatile Singleton::_instance = 0;
volatile Singleton* volatile Singleton::instance() {if (_instance == 0) {Lock lock;if (_instance == 0) {// one more volatile addedSingleton* volatile temp = new Singleton;_instance = temp;}}return _instance;
}

其實上面完全使用volatile關鍵字的代碼也不能保證正常工作在多線程環境中。具體原因分析請參考C++ and the Perils of Double-Checked Locking這篇論文,文章也給出了終極解決方法。

part 3:java之單例模式

介紹

意圖:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

主要解決:一個全局使用的類頻繁地創建與銷毀。

何時使用:當您想控制實例數目,節省系統資源的時候。

如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有則創建。

關鍵代碼:構造函數是私有的。

應用實例:

  • 1、一個班級只有一個班主任。

  • 2、Windows 是多進程多線程的,在操作一個文件的時候,就不可避免地出現多個進程或線程同時操作一個文件的現象,所以所有文件的處理必須通過唯一的實例來進行。

  • 3、一些設備管理器常常設計為單例模式,比如一個電腦有兩臺打印機,在輸出的時候就要處理不能兩臺打印機打印同一個文件。

優點:

  • 1、在內存里只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷毀實例(比如管理學院首頁頁面緩存)。

  • 2、避免對資源的多重占用(比如寫文件操作)。

缺點:沒有接口,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實例化。

使用場景:

  • 1、要求生產唯一序列號。

  • 2、WEB 中的計數器,不用每次刷新都在數據庫里加一次,用單例先緩存起來。

  • 3、創建的一個對象需要消耗的資源過多,比如 I/O 與數據庫的連接等。

注意事項:getInstance() 方法中需要使用同步鎖 synchronized (Singleton.class) 防止多線程同時進入造成 instance 被多次實例化。

實現

我們將創建一個 SingleObject 類。SingleObject 類有它的私有構造函數和本身的一個靜態實例。

SingleObject 類提供了一個靜態方法,供外界獲取它的靜態實例。SingletonPatternDemo 類使用 SingleObject 類來獲取 SingleObject 對象。

步驟 1

創建一個 Singleton 類。

SingleObject.java

public class SingleObject { //創建 SingleObject 的一個對象 private static SingleObject instance = new SingleObject(); //讓構造函數為 private,這樣該類就不會被實例化 private SingleObject(){} //獲取唯一可用的對象 public static SingleObject getInstance(){ return instance; } public void showMessage(){ System.out.println("Hello World!"); } }

步驟 2

從 singleton 類獲取唯一的對象。

SingletonPatternDemo.java

public class SingletonPatternDemo { public static void main(String[] args) { //不合法的構造函數 //編譯時錯誤:構造函數 SingleObject() 是不可見的 //SingleObject object = new SingleObject(); //獲取唯一可用的對象 SingleObject object = SingleObject.getInstance(); //顯示消息 object.showMessage(); } }

步驟 3

執行程序,輸出結果:

Hello World!

單例模式的幾種實現方式

單例模式的實現有多種方式,如下所示:

1、懶漢式,線程不安全

是否 Lazy 初始化:

是否多線程安全:

實現難度:

描述:這種方式是最基本的實現方式,這種實現最大的問題就是不支持多線程。因為沒有加鎖 synchronized,所以嚴格意義上它并不算單例模式。 這種方式 lazy loading 很明顯,不要求線程安全,在多線程不能正常工作。

實例

public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }

接下來介紹的幾種實現方式都支持多線程,但是在性能上有所差異。

2、懶漢式,線程安全

是否 Lazy 初始化:

是否多線程安全:

實現難度:

描述:這種方式具備很好的 lazy loading,能夠在多線程中很好的工作,但是,效率很低,99% 情況下不需要同步。 優點:第一次調用才初始化,避免內存浪費。 缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。 getInstance() 的性能對應用程序不是很關鍵(該方法使用不太頻繁)。

實例

public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }

3、餓漢式

是否 Lazy 初始化:

是否多線程安全:

實現難度:

描述:這種方式比較常用,但容易產生垃圾對象。 優點:沒有加鎖,執行效率會提高。 缺點:類加載時就初始化,浪費內存。 它基于 classloader 機制避免了多線程的同步問題,不過,instance 在類裝載時就實例化,雖然導致類裝載的原因有很多種,在單例模式中大多數都是調用 getInstance 方法, 但是也不能確定有其他的方式(或者其他的靜態方法)導致類裝載,這時候初始化 instance 顯然沒有達到 lazy loading 的效果。

實例

public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }

4、雙檢鎖/雙重校驗鎖(DCL,即 double-checked locking)

JDK 版本:JDK1.5 起

是否 Lazy 初始化:

是否多線程安全:

實現難度:較復雜

描述:這種方式采用雙鎖機制,安全且在多線程情況下能保持高性能。 getInstance() 的性能對應用程序很關鍵。

實例

public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }

5、登記式/靜態內部類

是否 Lazy 初始化:

是否多線程安全:

實現難度:一般

描述:這種方式能達到雙檢鎖方式一樣的功效,但實現更簡單。對靜態域使用延遲初始化,應使用這種方式而不是雙檢鎖方式。這種方式只適用于靜態域的情況,雙檢鎖方式可在實例域需要延遲初始化時使用。 這種方式同樣利用了 classloader 機制來保證初始化 instance 時只有一個線程,它跟第 3 種方式不同的是:第 3 種方式只要 Singleton 類被裝載了,那么 instance 就會被實例化(沒有達到 lazy loading 效果),而這種方式是 Singleton 類被裝載了,instance 不一定被初始化。因為 SingletonHolder 類沒有被主動使用,只有通過顯式調用 getInstance 方法時,才會顯式裝載 SingletonHolder 類,從而實例化 instance。想象一下,如果實例化 instance 很消耗資源,所以想讓它延遲加載,另外一方面,又不希望在 Singleton 類加載時就實例化,因為不能確保 Singleton 類還可能在其他的地方被主動使用從而被加載,那么這個時候實例化 instance 顯然是不合適的。這個時候,這種方式相比第 3 種方式就顯得很合理。

實例

public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }

6、枚舉

JDK 版本:JDK1.5 起

是否 Lazy 初始化:

是否多線程安全:

實現難度:

描述:這種實現方式還沒有被廣泛采用,但這是實現單例模式的最佳方法。它更簡潔,自動支持序列化機制,絕對防止多次實例化。 這種方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不僅能避免多線程同步問題,而且還自動支持序列化機制,防止反序列化重新創建新的對象,絕對防止多次實例化。不過,由于 JDK1.5 之后才加入 enum 特性,用這種方式寫不免讓人感覺生疏,在實際工作中,也很少用。 不能通過 reflection attack 來調用私有構造方法。

實例

public enum Singleton { INSTANCE; public void whateverMethod() { } }

經驗之談:一般情況下,不建議使用第 1 種和第 2 種懶漢方式,建議使用第 3 種餓漢方式。只有在要明確實現 lazy loading 效果時,才會使用第 5 種登記方式。如果涉及到反序列化創建對象時,可以嘗試使用第 6 種枚舉方式。如果有其他特殊的需求,可以考慮使用第 4 種雙檢鎖方式。

參考:

  1. Scott Meyers. Effective C++:55 Specific Ways to Improve Your Programs and Designs,3rd Edition. 電子工業出版社, 2011

  2. Stanley B. Lippman. 深度探索C++對象模型. 電子工業出版社, 2012

  3. Scott Meyers. C++ and the Perils of Double-Checked Locking. 2004

  4. 陳良喬(譯). C++11 FAQ中文版

  5. Bjarne Stroustrup. C++11 FAQ

  6. Paul E. McKenney, Hans-J. Boehm, Lawrence Crowl. C++ Data-Dependency Ordering: Atomics and Memory Model. 2008

  7. Wikipedia. Out-of-order execution

  8. Lo?c. Mutex And Memory Visibility, 2009

  9. Randal E.Bryant, David O'Hallaron. 深入理解計算機系統(第2版). 機械工業出版社, 2010

  10. Martin Thompson. Memory Barriers/Fences, 2011

  11. Working Draft, Standard For Programing Language C++. 2012

  12. W.Richard Stevens. UNIX環境高級編程(第3版), 人民郵電出版社, 2014

  13. stackoverflow. Is Meyers implementation of Singleton pattern thread safe

  14. stackoverflow. When are static C++ class members initialized

  1. https://segmentfault.com/a/1190000015950693

  1. https://www.cnblogs.com/liyuan989/p/4264889.html

總結

以上是生活随笔為你收集整理的【C++】C/C++ 中的单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

91av综合| 黄色免费看片网站 | 国产在线毛片 | 亚洲精品视频网址 | 美女视频a美女大全免费下载蜜臀 | 99久久精品午夜一区二区小说 | 欧美日韩在线观看视频 | 日本最新高清不卡中文字幕 | 精品美女在线视频 | 色av男人的天堂免费在线 | 国产精品久久电影网 | 麻豆精品91| 欧美成亚洲 | 一区二区三区手机在线观看 | 精品国产亚洲一区二区麻豆 | 国产精品毛片一区视频播 | 最新日韩电影 | 91精品夜夜 | 国产精品18久久久久久久久久久久 | 国产黄在线看 | 九九热在线播放 | 97视频在线免费播放 | 91成品人影院 | 日本精品二区 | 中文久久精品 | 91一区二区三区在线观看 | 成人国产精品一区二区 | 91精品国产三级a在线观看 | 免费视频99 | 精品在线99 | 中文字幕视频一区 | 成人h在线观看 | 中文字幕在线观看2018 | 色综合久久久网 | 成人av影视观看 | 99精品欧美一区二区三区 | 在线观看岛国 | 国产不卡免费视频 | 麻豆视频观看 | 一区在线观看视频 | 1024手机基地在线观看 | 日韩v在线| 久久三级视频 | 狠狠狠狠狠狠 | 国产精品毛片一区二区三区 | 欧美国产日韩在线视频 | 久久免费福利 | 免费网站看v片在线a | 久久九九影院 | 免费视频你懂的 | 91精品在线免费观看视频 | 国产一级视频免费看 | 看片网站黄 | 五月天婷婷在线观看视频 | 国产伦理一区二区三区 | 人人揉人人揉人人揉人人揉97 | 激情久久久 | 久久免费播放 | av高清一区| 久久97视频 | 天堂在线视频中文网 | 欧美日韩午夜在线 | 久久在线观看视频 | 青青河边草观看完整版高清 | 国产一区在线精品 | 国产精品永久久久久久久www | 一级一级一片免费 | 免费观看一区 | 97色免费视频 | 久久精品5 | 探花视频在线版播放免费观看 | 欧美日韩国产精品爽爽 | 国产成人精品国内自产拍免费看 | av解说在线 | 久久最新网址 | 国产精品1区2区在线观看 | a级国产乱理论片在线观看 伊人宗合网 | 国产精品高清免费在线观看 | 中国一级特黄毛片大片久久 | 成人免费一区二区三区在线观看 | 色综合久久久久综合体桃花网 | av成人免费网站 | 午夜在线国产 | 天天操天天操 | 国产亚洲成人网 | 日韩一级精品 | 亚洲美女视频在线 | 亚洲人成人在线 | 成人九九视频 | 日韩美女高潮 | 国产精品女人久久久久久 | 国产 字幕 制服 中文 在线 | 国产精品岛国久久久久久久久红粉 | 一区二区av| www视频在线免费观看 | 日日夜夜干 | 国产成人1区| 69国产精品视频免费观看 | 天天操天天爽天天干 | 精品在线视频一区二区三区 | 亚洲春色成人 | 欧美日韩精品在线一区二区 | 成人高清在线 | 91在线视频播放 | 国产精品女人久久久久久 | 国产精品免费观看在线 | 中文字幕乱视频 | 国产精品二区三区 | 国产999精品久久久久久绿帽 | 久久久久久国产精品美女 | 丁香激情网| 九九精品视频在线看 | 久久伊人综合 | 午夜精品视频一区二区三区在线看 | 九色视频自拍 | 国产黄色免费看 | 久久精品国产亚洲精品2020 | 国产成人精品999 | 婷婷天天色 | 一本一道久久a久久精品蜜桃 | 狠狠地操 | 激情五月婷婷综合网 | 99视频网站| 久久香蕉国产精品麻豆粉嫩av | 国产精品www | 国产精品九九久久久久久久 | 欧美一区二区在线刺激视频 | 蜜臀av夜夜澡人人爽人人 | 99久久这里只有精品 | 91九色在线 | 日韩av视屏在线观看 | 一级c片 | 成人av在线影视 | 91中文字幕在线 | 六月婷婷久香在线视频 | 麻豆超碰| 久久精品视频国产 | 色婷婷激情综合 | 综合五月 | 婷婷丁香狠狠爱 | 极品美女被弄高潮视频网站 | 五月婷婷综合久久 | 九九热在线视频免费观看 | 视频国产| 亚洲欧美激情精品一区二区 | 碰天天操天天 | 欧美少妇xx| 91亚色在线观看 | 国产一级电影网 | 欧美日韩国产高清视频 | 婷婷国产视频 | 人人插人人 | 麻豆国产精品va在线观看不卡 | 少妇啪啪av入口 | 欧美日韩国产三级 | 久久亚洲精品国产亚洲老地址 | 日韩欧美国产成人 | 久久天天躁狠狠躁夜夜不卡公司 | 欧美亚洲一区二区在线 | 在线看v片 | 美女免费电影 | 国产很黄很色的视频 | 国产精品国产亚洲精品看不卡15 | 丁香婷婷在线 | 日韩在线观看 | 丁香激情网 | 国产亚洲aⅴaaaaaa毛片 | 国产美女免费观看 | 日韩二级毛片 | 日韩成人av在线 | 永久免费的av电影 | 一级淫片在线观看 | 久草视频免费看 | 色爱区综合激月婷婷 | 黄色日批网站 | www.福利 | 国产系列 在线观看 | 91网站在线视频 | 女人魂免费观看 | 欧美日韩国产精品爽爽 | 国产黄色在线网站 | 九九九热精品免费视频观看 | 国产精品入口麻豆www | 狠狠五月天 | 天天综合天天做天天综合 | 久久久久久久国产精品 | 中文字幕在线看视频国产中文版 | 337p西西人体大胆瓣开下部 | 亚洲综合精品在线 | 国产视频每日更新 | 亚洲午夜久久久久久久久电影网 | 国产黄色精品在线 | 日本xxxxav| 伊人色综合久久天天 | 在线观看韩日电影免费 | 91看片在线观看 | 国产精品区免费视频 | 久久a v视频| 日b黄色片| 97视频免费 | 国产精品国产三级在线专区 | 国产午夜三级一二三区 | 看片的网址 | av东方在线 | av在线看网站 | 午夜在线免费观看视频 | 伊人色综合久久天天 | 天天透天天插 | 久久另类视频 | 伊人久久婷婷 | 丁香激情视频 | 亚洲码国产日韩欧美高潮在线播放 | 久久国产精品区 | 日韩草比 | 国产精品成人自产拍在线观看 | 日本丶国产丶欧美色综合 | 国产美女主播精品一区二区三区 | 精品产品国产在线不卡 | 黄p在线播放 | 国产高清永久免费 | 久久精品91久久久久久再现 | 国产午夜精品一区二区三区在线观看 | 夜夜爽88888免费视频4848 | 911香蕉| 五月天伊人 | 五月激情片 | 99精品视频在线播放免费 | 国产精品久久久久久婷婷天堂 | 手机av看片| aaa毛片视频| 欧美激情视频在线免费观看 | 天天综合网久久综合网 | 亚洲少妇自拍 | 91精品久久久久久粉嫩 | 国产福利在线 | 国产一级电影在线 | 国产视频在 | 久草在线免费在线观看 | 国产乱码精品一区二区三区介绍 | 国产精品高 | 超碰免费公开 | 久草视频在线资源 | 久久在视频 | 中文亚洲欧美日韩 | 国产成人精品一区二区三区在线 | 亚州精品一二三区 | 天堂av网站 | 最近中文字幕在线 | 婷婷五天天在线视频 | 日韩有码网站 | 干干操操| 色综合天天 | 色a在线观看 | 久久亚洲综合色 | 国产日韩在线播放 | 麻豆91精品视频 | 激情丁香月| 最近免费中文视频 | 国产日韩欧美在线看 | 成人国产电影在线观看 | 国产中文字幕在线观看 | 色射色| 欧美天天综合 | 97超级碰碰碰碰久久久久 | 狠狠做深爱婷婷综合一区 | 久久短视频 | 夜夜骑首页 | 正在播放久久 | 91久久久国产精品 | av在线播放中文字幕 | 亚洲精品理论 | 亚洲欧美色婷婷 | 91看国产| 国产小视频在线免费观看视频 | 国产资源在线播放 | 在线观看一区二区视频 | 日韩精品不卡在线观看 | 久久久久久久久久久久国产精品 | 国产成人久久久77777 | 天天插天天色 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 精品一区二区精品 | 日韩av中文| 日韩精品高清视频 | 超碰日韩 | 久久久免费视频播放 | 成人a视频在线观看 | 国产精品少妇 | 一本一本久久a久久精品牛牛影视 | 玖玖爱免费视频 | 丝袜av网站| 免费三及片 | 日韩一区二区在线免费观看 | 91少妇精拍在线播放 | 99视频偷窥在线精品国自产拍 | 人成午夜视频 | 亚洲理论视频 | 久久激情视频网 | 日韩免费一区二区三区 | 中中文字幕av | 一级片视频在线 | www.看片网站 | 久久久久久久久久久免费av | 青青网视频| 欧亚久久 | 欧美日韩网址 | 久久精品一区二区三 | 最近中文字幕免费视频 | 亚洲蜜桃av | 国产99久久精品一区二区300 | 亚州黄色一级 | 免费大片黄在线 | 91久久国产露脸精品国产闺蜜 | 国产日韩欧美在线观看 | 玖玖玖国产精品 | 中文字幕中文字幕 | 亚洲欧洲中文日韩久久av乱码 | 在线观看亚洲国产精品 | 91久久久久久久 | 91麻豆.com| 欧美aa级| 99久久久久免费精品国产 | 久久深夜福利免费观看 | 四虎影视www | 精品一区二区免费 | 夜夜看av | 91精品一区二区三区久久久久久 | 国产精品毛片久久 | 综合久久2023 | 亚洲天堂网视频在线观看 | 成人资源在线 | 99精品免费视频 | 免费欧美 | 国产老熟| 久久免费在线观看 | 成人国产精品一区 | 波多野结衣视频一区 | 亚洲国产操 | 手机在线欧美 | 69国产盗摄一区二区三区五区 | 91福利在线观看 | 性色av一区二区 | www免费网站在线观看 | 黄色小说免费观看 | 免费色视频 | 九九久久影视 | 日本久久精品 | 久久国产精品色av免费看 | 99久久精品国产系列 | 好看的国产精品视频 | 999国内精品永久免费视频 | 成人免费在线网 | 国产 中文 日韩 欧美 | 在线日本看片免费人成视久网 | 91精品国自产拍天天拍 | 国产精品女主播一区二区三区 | 国产视频久久久久 | 欧洲视频一区 | 国产视频一区二区在线观看 | 欧美极度另类性三渗透 | 成人免费观看电影 | 蜜桃视频在线视频 | 青青河边草免费直播 | 天天干天天操天天爱 | 99爱精品视频 | 亚洲精品国产成人av在线 | 五月婷婷激情综合 | 丝袜一区在线 | 亚洲免费黄色 | 国内精品毛片 | 成人免费视频网站在线观看 | 免费av片在线 | 国产视频亚洲 | 亚洲精品国产片 | 91九色免费视频 | 久亚洲 | 久久精品网站免费观看 | 国产黄色免费看 | 美女网站视频免费都是黄 | 国产成人av免费在线观看 | www.大网伊人 | 亚洲精品乱码久久久久久蜜桃不爽 | 天天色图 | 国产黄a三级三级三级三级三级 | 激情视频一区二区三区 | 天天射天 | 天天插天天狠天天透 | 中文在线中文资源 | 91免费高清视频 | 亚洲va在线va天堂va偷拍 | 免费观看成人 | 久久久免费观看视频 | 亚洲欧美日本国产 | 在线免费高清视频 | 日韩精品亚洲专区在线观看 | www视频在线观看 | 欧美伦理电影一区二区 | 日韩高清一二三区 | 91桃色在线观看视频 | 黄色一级大片免费看 | 亚洲天堂网在线视频 | 久久久久久久久久久免费 | 五月婷婷,六月丁香 | 日韩免费在线观看视频 | 国产一级在线看 | 日韩欧美在线视频一区二区 | 三级黄在线| 亚洲天堂网站视频 | 激情在线网址 | 色婷婷综合久久久久中文字幕1 | 亚洲美女视频在线观看 | 黄色亚洲大片免费在线观看 | 欧美性天天 | 99久久久国产精品免费观看 | 黄色一区二区在线观看 | 色多视频在线观看 | 久久免费毛片 | 一级片色播影院 | 国产精品 中文在线 | 91精品免费在线观看 | 亚洲精品久久视频 | 亚洲精品乱码久久久一二三 | 欧美一级免费黄色片 | 综合五月 | 狠狠操狠狠 | 一级淫片在线观看 | 欧美aaa一级| 亚洲午夜久久久久久久久 | 在线观看国产区 | 欧美性色xo影院 | 国产一级做a爱片久久毛片a | 成年人免费在线播放 | 久久婷婷丁香 | 久久在线 | 国产香蕉久久 | 久久国产精品精品国产色婷婷 | 国产一区在线不卡 | 在线观看日本韩国电影 | а天堂中文最新一区二区三区 | 99久久婷婷| 五月开心六月伊人色婷婷 | 中文字幕亚洲欧美 | 国产免费午夜 | 久久精品一区二区三区国产主播 | 久久99久久99精品 | 国产99久久久久久免费看 | 免费日韩 精品中文字幕视频在线 | 亚洲五月激情 | 麻花天美星空视频 | 黄毛片在线观看 | 日日夜夜添 | 91精品区 | 91网免费看| 欧美一级小视频 | 中文在线字幕免费观 | 草免费视频 | 超碰在线资源 | 国产一级黄色片免费看 | 天堂在线免费视频 | 亚洲国产成人久久 | japanese黑人亚洲人4k | 久久久国产一区二区三区四区小说 | 国产精品区在线观看 | 亚洲精品一区中文字幕乱码 | 亚洲在线视频免费观看 | 日韩高清不卡一区二区三区 | 麻豆国产精品永久免费视频 | 69夜色精品国产69乱 | 久久99热这里只有精品国产 | 亚洲精品理论片 | 国产一区在线不卡 | a在线视频v视频 | 免费网站看av片 | 国产精品久久久久久久久久妇女 | 亚洲国产精品一区二区久久hs | 色偷偷97 | 亚洲国产精品va在线看 | 国产精品电影一区二区 | 日日夜夜精品 | 免费三级av | 五月花婷婷 | 亚洲人成人在线 | 91精品久久久久久 | 国内成人精品2018免费看 | 91精品视频免费 | 成人在线播放免费观看 | 麻豆精品视频在线观看免费 | 欧美a级片网站 | 国内精品久久久久影院优 | 色停停五月天 | 国产xxxx做受性欧美88 | 久久人人爽视频 | 免费观看一级 | 91久久奴性调教 | 91九色网站 | 亚洲精品免费播放 | 亚洲手机av | 麻豆综合网 | 国产精品久免费的黄网站 | 色婷婷免费视频 | 久久久久久国产精品久久 | 91九色视频在线播放 | 91av原创| 免费看精品久久片 | 99热99| 精品久久福利 | 中文字幕亚洲欧美日韩2019 | 99久热在线精品视频 | 在线小视频 | 国产精品观看在线亚洲人成网 | 久久久久久久久久久免费av | 国产精品免费视频久久久 | 日韩电影在线观看一区 | 亚洲国产97在线精品一区 | 久一久久 | 四虎成人精品永久免费av | 狠狠干2018| 免费av免费观看 | 波多野结衣视频一区二区三区 | 亚洲国产网站 | 在线中文字幕观看 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 一区二区三区三区在线 | 亚洲精品成人 | 日韩在线网址 | av解说在线观看 | 日韩电影在线观看一区二区三区 | 视频一区二区在线 | www91在线观看 | 久草电影在线观看 | 成年免费在线视频 | 亚洲欧洲一区二区在线观看 | 福利视频午夜 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 欧美一级性生活片 | 91久久精品一区二区二区 | 色.com| 一级理论片在线观看 | 国内三级在线 | 91成人网页版 | 欧美网址在线观看 | 超碰97免费在线 | 免费观看成人网 | 夜夜操狠狠干 | 成人动漫一区二区 | 天天干夜夜擦 | 九色91福利 | 久久久久久久久久福利 | 国产传媒中文字幕 | 国产成人久久久77777 | 久久国产精品久久国产精品 | 国产视频 亚洲视频 | 手机在线永久免费观看av片 | 国内久久看 | 国产黄色在线网站 | 日韩av片免费在线观看 | 国产在线综合视频 | a天堂在线看 | 免费久久片| 狠狠狠狠狠狠狠狠干 | 成人 国产 在线 | 天天操天天操天天操天天 | 国产一区视频在线播放 | 91精品一区二区在线观看 | 九九有精品 | 激情网综合| 国产精品伦一区二区三区视频 | av高清网站在线观看 | 日韩一区在线播放 | 久久久久在线观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | www.狠狠插.com| 亚洲一级国产 | 国产精选在线 | 人人揉人人揉人人揉人人揉97 | 狠狠色狠狠色合久久伊人 | 色网站免费在线观看 | 在线观看免费视频你懂的 | www.日韩免费| 久久久久免费精品视频 | 91日韩精品 | 免费看黄在线网站 | 深夜男人影院 | 国产九九热视频 | 狠狠色噜噜狠狠狠狠 | 91一区二区三区在线观看 | 日韩精品免费在线播放 | 在线免费观看不卡av | 日韩久久久久 | 狠狠色丁婷婷日日 | 国产精品久久网站 | 91天天操| 国产精品自拍在线 | 久久精品免费 | 成年人在线观看视频免费 | 国产精品一区二区久久精品 | 成人在线你懂得 | 欧洲亚洲女同hd | 精品国产一区二区三区男人吃奶 | 在线观看视频免费大全 | 免费成人av在线 | 欧美日韩国产一区二区三区在线观看 | 免费能看的黄色片 | 久久精品日产第一区二区三区乱码 | 日日干网址| 精品视频免费 | 日韩欧美电影在线 | 亚洲欧美日韩一级 | 92中文资源在线 | 在线观看的黄色 | 日韩精品五月天 | 成人午夜电影在线观看 | 国产成人精品一区二区三区在线观看 | 亚洲国产日韩欧美在线 | 丁香六月久久综合狠狠色 | 97人人模人人爽人人少妇 | 欧美日韩视频一区二区三区 | 国产精品视频专区 | 免费av黄色 | 精品久久久久久亚洲综合网站 | 国产原创av在线 | 亚洲伊人天堂 | 99re亚洲国产精品 | 国产午夜精品一区 | 99在线热播 | 热久久免费视频 | 狠狠色噜噜狠狠狠合久 | 欧美久久久久久久久久久久久 | 天天操天天射天天舔 | 亚洲免费一级电影 | 美女视频免费一区二区 | 91视频久久久 | 九色视频网址 | 欧美日韩国产三级 | h文在线观看免费 | 亚洲在线成人精品 | www国产亚洲精品久久麻豆 | 亚洲欧洲中文日韩久久av乱码 | 日韩精品视频在线观看网址 | 99热在线这里只有精品 | 久久国产手机看片 | 美女网站在线观看 | 97国产大学生情侣白嫩酒店 | 国产精品免费高清 | 麻豆影视网 | 亚洲资源一区 | 丁香六月综合网 | 日韩免费在线 | 四虎影院在线观看av | 人人爽久久久噜噜噜电影 | 免费麻豆视频 | 天天操偷偷干 | 伊人狠狠色丁香婷婷综合 | 国产成人精品一区二 | 国产69精品久久久久久久久久 | 日韩精品视频在线观看网址 | 精品久久国产精品 | 国产精品久久久区三区天天噜 | 国产99久久精品一区二区永久免费 | 中文字幕色在线 | 亚洲精品国产精品国产 | 久久久久久综合网天天 | 久久久精品视频网站 | 亚洲天堂色婷婷 | 在线观看日韩一区 | 免费看污片| 久草视频99 | 日韩免费看的电影 | 一区二区三区高清在线 | jizz欧美性9| 久久综合桃花 | 麻花传媒mv免费观看 | 日韩欧美视频在线 | 久久中文字幕导航 | 人人插人人澡 | 青春草免费在线视频 | 中文字幕免费高清在线观看 | 成人av一区二区兰花在线播放 | 人人要人人澡人人爽人人dvd | 国产精品久久久 | 亚洲在线国产 | 日韩免费一级电影 | 亚洲精品视频免费在线 | 国产精品免费看久久久8精臀av | 亚洲黄色在线播放 | 玖玖在线视频观看 | 国产做a爱一级久久 | 人人射人人爱 | 国产精品三级视频 | 国产成人精品一区二区三区网站观看 | 中文字幕成人网 | 欧美激情视频在线免费观看 | 激情网婷婷 | 日日干网址 | www.操.com| 91精品啪啪 | 色视频成人在线观看免 | 日韩av电影一区 | 免费观看91视频 | 综合激情网... | 亚洲国产精品久久久久 | 久久久久久久久毛片 | 日本午夜在线观看 | 三级黄色片在线观看 | 国产成人一区二区三区 | 91天堂在线观看 | 91九色性视频 | 国产精品国产三级国产不产一地 | 日韩动漫免费观看高清完整版在线观看 | 国产一区观看 | 91色影院| 黄色一级片视频 | 天天干天天上 | 国产精品乱码久久久久久1区2区 | 亚州精品在线视频 | 精品国产电影一区二区 | 国产精品成人一区二区三区吃奶 | 成人一级电影在线观看 | 久操伊人 | 久久高视频 | 黄色av在 | 日韩精品一区二区在线 | 国产成人99av超碰超爽 | 激情五月六月婷婷 | 91麻豆视频 | 亚洲天天摸日日摸天天欢 | 久久黄色影视 | 天天操天天摸天天干 | 91传媒激情理伦片 | 一区二区三区免费看 | 国产亚洲在线 | 天天夜夜狠狠操 | 色视频网站免费观看 | 久久亚洲美女 | 国产精品网红福利 | 免费观看日韩av | av在线网站观看 | 精品在线观看一区二区三区 | 在线观看视频一区二区三区 | 国产亚洲成av人片在线观看桃 | 成人国产网址 | 中文字幕在线专区 | av中文电影 | 国产一区二区三区在线免费观看 | 91九色视频 | 中文字幕 国产专区 | 日本在线视频网址 | 亚洲激情校园春色 | 欧美日韩国产页 | 最近日韩免费视频 | 日韩中文在线字幕 | 亚洲最新视频在线播放 | 国产精品一区二区av影院萌芽 | 色激情五月 | 国产精品久久久久久久电影 | 欧美视频日韩视频 | 亚洲伦理一区 | 五月天视频网 | 91亚洲永久精品 | 成人蜜桃| 999久久久国产精品 高清av免费观看 | 国产精品免费大片视频 | 日韩有色| 亚洲aⅴ乱码精品成人区 | a级国产毛片 | 日韩av在线免费播放 | 国产高清亚洲 | 五月天堂网 | 欧美在线视频一区二区 | 日韩av在线免费看 | 91久久久久久国产精品 | 日韩午夜在线观看 | 狠狠干狠狠久久 | 中文字幕在线视频一区二区三区 | 81国产精品久久久久久久久久 | 国产三级精品三级在线观看 | 久久电影日韩 | 九九九在线观看 | 国产视频在线观看一区 | 天干啦夜天干天干在线线 | 成年人在线免费看 | 国产中文字幕视频在线观看 | 色婷婷在线播放 | 日韩不卡高清 | 亚洲视频专区在线 | 日本在线观看中文字幕 | 欧美日韩一区二区久久 | 免费黄色在线播放 | 国产成人一区二区三区在线观看 | 伊人久久一区 | 在线观看日韩精品视频 | 黄色毛片视频免费观看中文 | 国产精品久久久久一区 | 97天堂 | 久久视精品| 日韩av快播电影网 | 日韩综合一区二区三区 | 人人躁 | 国产精品国产三级国产 | 91成人看片| 91精品天码美女少妇 | 国产精品免费视频一区二区 | 精品免费观看视频 | 国产高清视频在线观看 | 国模一二三区 | 国产成在线观看免费视频 | 久久超 | 韩日精品在线观看 | 午夜精品福利影院 | 国产日韩欧美在线免费观看 | 久久狠狠亚洲综合 | 日日干夜夜干 | 亚洲 综合 专区 | 亚洲每日更新 | 在线免费看黄网站 | 二区三区在线视频 | 日韩精品中文字幕久久臀 | 亚洲久草视频 | 黄色福利网站 | 免费av网址在线观看 | 最新不卡av | 亚洲精品在线免费播放 | 亚洲最大成人免费网站 | 色综合久久88色综合天天人守婷 | 国产不卡网站 | 国产精品女同一区二区三区久久夜 | 99婷婷狠狠成为人免费视频 | 国内视频1区 | 亚洲精品视频在线观看免费视频 | 久久成人人人人精品欧 | 国产精品一区二区av日韩在线 | 青草视频在线 | 黄色av网站在线免费观看 | 久久视频网址 | 久久在线影院 | 丁香综合五月 | 天天色欧美 | aaawww| 欧美a级片免费看 | 国产热re99久久6国产精品 | 国产精品久久久久毛片大屁完整版 | 国产在线中文 | 欧美精品中文字幕亚洲专区 | 一区二区三区免费看 | 日韩高清免费在线 | 九九日九九操 | www.久久久.com | 亚洲综合欧美激情 | 久久精品国产亚洲精品2020 | 日韩在线观看一区二区三区 | 亚洲精品视频大全 | 九九免费视频 | 网站在线观看你们懂的 | 国产精品亚州 | 亚洲精品99 | 成人av在线观 | 天天草天天干天天 | 亚洲成人家庭影院 | 婷婷久久亚洲 | 最近日韩免费视频 | 正在播放日韩 | 91福利视频在线 | 天天操狠狠干 | avlulu久久精品 | 色噜噜在线观看 | 国产99久久久国产精品 | a√天堂资源 | 久热色超碰 | 天天射天天干天天操 | 91社区国产高清 | www日 | 狠狠五月天 | 在线视频福利 | 99视频免费播放 | 中文字幕4| 日韩不卡高清 | av成人黄色 | 国产麻豆果冻传媒在线观看 | 黄色三级免费网址 | 在线观看www视频 | 天堂久久电影网 | 日韩精品一区二区三区水蜜桃 | 九色福利视频 | 国产午夜精品一区二区三区在线观看 | 国产99久久久久久免费看 | www免费视频com━ | 中文区中文字幕免费看 | 五月婷婷激情综合网 | a久久免费视频 | 国内视频在线 | 夜添久久精品亚洲国产精品 | 天天干天天操天天干 | 天天干天天射天天操 | 人人爱爱 | 国产成人一区二区啪在线观看 | av不卡网站| 成人午夜av电影 | 日韩在线观看小视频 | 成人久久久久久久久久 | 久久精品成人欧美大片古装 | 国产成a人亚洲精v品在线观看 | 9999亚洲| 绯色av一区 | 午夜久草 | 国产大陆亚洲精品国产 | 日本视频高清 | 久草视频在线免费 | 涩涩网站在线观看 | 日韩天堂在线观看 | 亚洲欧美偷拍另类 | 最新午夜电影 | 综合久久网站 | 中文字幕av最新 | 丁香六月国产 | 黄色网址在线播放 | 免费午夜在线视频 | 日韩视频www | 免费观看版 | 免费看色视频 | 国产成人精品亚洲a | 一区三区视频 | 91精品少妇偷拍99 | 最近字幕在线观看第一季 | 久久免费国产 | 美女黄频网站 | 高清日韩一区二区 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 精品视频在线视频 | 国产999精品久久久久久麻豆 | 久久99精品久久久久久清纯直播 | 欧美精品一区二区蜜臀亚洲 | 国产五月色婷婷六月丁香视频 | 久久一级片 | 在线播放日韩av | 国产一区免费观看 | 日本久久不卡视频 | 日韩一区在线免费观看 | 亚洲成人午夜av | 成人久久久久 | 亚洲精品视频在线观看免费视频 | 人人插人人插 | 国产小视频国产精品 | 亚洲国产精品成人av | 黄色日批网站 | 国产成人在线观看免费 | av888.com | 69亚洲精品 | 免费大片av | 狠狠网| 亚洲一区久久久 | 超碰午夜 | 亚洲欧洲国产日韩精品 | 亚洲婷婷伊人 | 日韩有码中文字幕在线 | 国产传媒一区在线 | 国产99区| 欧美日韩电影在线播放 | 国产精品免费一区二区 | 亚洲精品视频免费在线 | 四虎国产视频 | 国产99久久久国产精品 | 日韩a级免费视频 | 探花视频免费在线观看 | 国产日韩在线一区 | 在线观看深夜视频 | 国产亚洲婷婷免费 | 久久成人亚洲欧美电影 | 精品国产一区二区三区久久 | 中文字幕在线日 | 国产香蕉久久精品综合网 | av一二三区 | 中文字幕在线色 | 欧美精品亚洲二区 | 色婷婷久久久综合中文字幕 | 91香蕉视频污在线 | 超碰在线个人 | 超碰在线免费97 | 色视频网站在线观看一=区 a视频免费在线观看 | 日韩精品一卡 | 黄色小说免费在线观看 | 国产专区欧美专区 | 亚洲综合涩 | 色伊人网 | 色吊丝在线永久观看最新版本 | 久久专区| 中文字幕av在线不卡 | 日韩精品一区二区三区水蜜桃 | 精品久久久久久国产偷窥 | 一级成人网 | 黄色小网站在线观看 | 欧美日韩在线视频一区 | 精品久久精品 | 久久综合免费视频影院 | 国产精品久久久影视 | 91亚·色| 成人av影视在线 | 亚洲色影爱久久精品 | 久久99国产精品久久 |