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

2021-08-04 23:50:35 字數 1163 閱讀 6123

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

分析:

// 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 設計乙個單例模式的類

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

劍指offer02 替換空格

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

劍指offer 02替換空格

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