如何實現乙個類只能例項化乙個物件?
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項
顯然單例模式的要點有三個;一是某個類只能有乙個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。
從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的建構函式,二是類定義中含有乙個該類的靜態私有物件,三是該類提供了乙個靜態的公有的函式用於建立或獲取它本身的靜態私有物件。
版本一:使用快載入,不論是否使用直接例項化
class singleton
private:
singleton() {};
static singleton single;
};singleton singleton::single = singleton::getinstace() ;
版本二:使用懶載入,只有在使用時才例項化
class singleton
return single;
}private:
singleton(){}
static singleton *single;
};singleton * singleton::single = null;
版本三:考慮多執行緒安全問題,使用互斥鎖同步
判斷是否是執行緒安全的——是否存在竟態條件(存在竟態條件,非執行緒安全的)
判斷是否存在竟態條件——隨著執行緒排程順序不同,程式結果是否相同(不相同,存在竟態條件)
存在竟態條件的**區稱為臨界區、臨界區的**必須是原子操作、實現原子操作要使用互斥鎖
在本**中,if語句不是原子操作,需要使用互斥鎖同步
class singleton
pthread_mutex_unlock(&mutex);
return single;
}private:
singleton(){}
static singleton *single;
};singleton* singleton::single= null;
版本四:版本三雖然解決了多執行緒安全問題,但在單執行緒中每次都需要獲取鎖釋放鎖而導致效率低下,所以將鎖放到if語句中
class singleton
return single;
}private:
singleton(){}
static singleton *single;
};singleton* singleton::single= null;
版本五:版本四雖然解決了單執行緒效率問題,但由於new不是原子操作,依然存在多執行緒安全問題,使用雙重if判斷
單執行緒時,只需要執行一次獲取釋放互斥鎖操作,之後第乙個if語句都為false
多執行緒時,依舊考慮執行緒安全與競態條件問題
class
singleton
pthread_mutex_unlock(&mutex);
}return single;
}private:
singleton(){}
static singleton *single;
};singleton * singleton::single = null;
版本六:考慮編譯器的指令優化和cpu的動態指令優化
volatile關鍵字阻止編譯器為了提高速度將乙個變數快取到暫存器內而不寫回記憶體
volatile關鍵字阻止編譯器調整操作volatile變數的指令操作
barrier指令會阻止cpu對指令進行動態換序優化
class singleton
pthread_mutex_lock(&mutex);
}return single;
}private:
singleton(){}
volatile
static singleton *single;
};volatile singleton* singleton::single= null;//快載入 懶載入
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...