3.3 靜態初始化
4.拓展
說到單例模式想必大家都不陌生,為了加深自己對單例模式的理解,我又對單例模式進行了複習.(本節部分內容節選自大話設計模式第21章)
即保證乙個類僅有乙個例項,並提供有乙個訪問它的全域性訪問點.
通常我們可以讓乙個全域性變數是的乙個物件被訪問,但它不能防止你例項化多個物件.此時乙個最好的辦法就是:讓類自身負責儲存它的唯一例項.這個類可以保證沒有其他例項可以被建立,並且他可以提供乙個訪問該例項的方法.
先上乙個較為普遍的寫法(沒錯!他有很多寫法,但萬變不離其宗)
class
singleton
public
static
singleton
getinstace()
//獲取本類例項的唯一全域性訪問點
return instace;
}}
呼叫方式:
singleton.
getinstace()
;
這裡就不做過多解釋了.
當多執行緒程式中,多個執行緒同時
訪問singleton
類,呼叫getinstance()
方法,就會有可能建立出多個例項
這時候我們就需要lock
關鍵字了.
lock
是確保當乙個執行緒位於**的臨界區時,另乙個執行緒不進入臨界區.如果其他執行緒試圖進入鎖定的**,則它將已知等待(即被阻止),知道該物件被釋放.
結合下面**,你會有乙個更直觀的感受.
class
singleton
private
static
readonly
object syncroot =
newobject()
;//程式執行時建立乙個 靜態 唯讀 的 程序輔助物件
public
static
singleton
getinstace()
}return instace;
}}
這段**使得物件例項由最先進入的那個執行緒建立,以後的執行緒在進入時不會再去建立物件例項了.由於有了lock
,就保證了多執行緒環境下的同時訪問也不會造成多個例項的生成.
但當你仔細觀察,你就會發現另乙個問題,每次getinstance()
時,都需要lock
,是會影響效能的吧.所以就有了雙重鎖定
class
singleton
private
static
readonly
object syncroot =
newobject()
;public
static
singleton
getinstace()
}}return instace;
}}
細心的你可能已經發現了就多了一行**.
可能你又會有疑問了:為什麼在外面判斷了instance
是否存在,再加鎖之後還要判斷一次呢?
我們來一步一步分析
當第乙個你品,你細品,是不是這個理?inatance
不為空的時候,皆大歡喜 ,直接return
當第乙個inatance
為空的時候,同時又有兩個程序來呼叫getinstance()
的時候,lock
開始真正起作用,先進來的程序,會new
一次物件,當第乙個程序結束,出去後,第二個程序繼續進入,如果此時沒有第二個"instance==null"
的判斷,第二個程序還是依然會繼續new
一次.並沒有達到單例的目的了呀.
c#與公共語言庫也提供了一種靜態初始化
方法,這種方法不需要開發人員顯式的編寫執行緒安全**,就可也解決多執行緒環境下它是不安全的問題.
//sealed 關鍵字修飾類,叫做密封類 這裡防止發生派生類,因為派生類可能會發生例項
public
sealed
class
singleton
public
static
singleton
getinstace()
}
當寫到這裡的時候是不是有些小夥伴就會有這樣的疑問了?(不!我沒有!!你不要強行安排我!!!)
這怎麼和實用類的靜態方法類似?比如你看看.net的math類,是不是很像???
同:實用類通常也會採取私有化建構函式來防止起有例項異:1.實用類不儲存狀態,僅會提供一些靜態方法和變數給你使用,但是單例類是會有狀態的.
2.實用類不能用於繼承多型,而雖然單例類雖然唯一,但卻可以有子類來繼承.
3.實用類只不過是一些方法屬性的集合,而單例卻是有唯一的物件例項.
1.保證唯一的例項化由於2.單例模式因為singleton類封裝他的唯一例項,這樣它可以嚴格控制客戶怎樣訪問和何時訪問.簡單來說就是對唯一例項的受控訪問.
unity
是主要是單執行緒
的,所以通常對多執行緒並不關注.但並非是不用lock
,是用的比較少.
關於unity
的多執行緒可以參考這篇文章,如果對unity多執行緒
感興趣的話可以抽時間詳細去了解一下.
**懶漢:**在第一次引用就將自己例項化,被稱為懶漢式單例
.例如普遍寫法
那個模組的實現方式就是.
**餓漢:**當自己被載入時就將自己例項化,被稱為餓漢式單例
.例如靜態初始化
那個模組的實現方式就是.
差異:
餓漢式:是一種靜態初始化的方式,他是類一載入就例項化物件,所以要提前占用系統資源.這種事情是根據實際需求而改變的.懶漢式:會面臨著多執行緒訪問的安全性問題,需要做雙重鎖定這樣的處理才能保證安全.
對於unity
開發者,如果不在多執行緒裡使用的話,其實兩者都可以,最好還是用懶漢模式
,畢竟餓漢模式會提前占用記憶體優先考慮執行緒安全問題的話,那就用
餓漢模式
好了.
設計模式 單例模式
單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...