劍指offer 02 設計乙個單例模式的類

2021-12-30 02:15:14 字數 1143 閱讀 5386

設計乙個類,我們只能生成該類的乙個例項。

分析:

只能生成乙個例項的類,實際上是單例模式的型別。 為防止使用者生成新物件,將建構函式宣告為私有或受保護 生成乙個物件,可以將其用靜態成員函式來記錄,指向這個物件的指標宣告為靜態變數,存放在靜態儲存區,把該類的物件用new來構造放在堆中// vs 2015

#include "stdafx.h"

#include

#include

#include

using namespace std;

class singleton ;

singleton(const singleton &);

public:

static singleton * getinstance()

};singleton* singleton::instance = nullptr;

int main()

程式在vs 2015中可執行。

問題:上述**在單執行緒時工作正常。但在多執行緒下存在問題。如果兩個執行緒同時執行到判斷

if (instance == nullptr)語句時,且instance還未被建立,則兩個執行緒都會建立乙個例項。這樣就不滿足單例模式的要求。

解決:多執行緒環境下加鎖

mutex mux;

class singleton

};singleton* singleton::instance = nullptr;其實還有問題:每次想獲取這個物件時,呼叫getinstance函式都會試圖上鎖,造成效率不高。可以這樣,由於每個時刻只有乙個執行緒能得到鎖,則每次先判斷是否已建立,然後再加鎖處理。

假設兩個執行緒同時訪問判斷句,且此時並未建立,則兩者競爭鎖,有乙個上鎖進去建立物件然後退出。另乙個得到鎖進去發現已建立則退出。當後面再訪問物件時,先判斷是否建立,這時已建立則不會搞鎖。

mutex mux;

class singleton ;

singleton(const singleton &);

public:

static singleton * getinstance()

return instance;

}};singleton* singleton::instance = nullptr;

劍指offer 02 設計乙個單例模式的類

設計乙個類,我們只能生成該類的乙個例項。分析 vs 2015 include stdafx.h include include include using namespace std class singleton singleton const singleton public static si...

劍指offer02 替換空格

自己寫的 public class solution return str.tostring 思路 1.統計空格個數count 2.設定新的字串長度newlen 原長度 2 count 3.設定兩個指標,indexold和indexnew,分別指向舊陣列末尾和新陣列末尾,從後向前遍歷。有兩種情況 1...

劍指offer 02替換空格

首先我們先算出整個字串的長度,還有總共多少個空格。因為空格只佔乙個位元組,但是 20 佔兩個位元組,所以新的容量是原來字串長度 空格數 2,然後把新的容量與給定的字串總大小作比較,如果大於給定的大小,就說明給的用例出錯了,直接返回。如果沒出錯,從原來字串末尾開始遍歷,如果是空格,則依次附給新字串同時...