設計乙個類,我們只能生成該類的乙個例項。分析:
// 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,然後把新的容量與給定的字串總大小作比較,如果大於給定的大小,就說明給的用例出錯了,直接返回。如果沒出錯,從原來字串末尾開始遍歷,如果是空格,則依次附給新字串同時...