單例模式製造獨一無二的物件

2021-09-27 19:06:37 字數 1313 閱讀 4297

為什麼不用靜態全域性變數呢?如果將物件賦值給全域性變數,那麼你必須在程式一開始就建立物件,非常消耗資源。利用單例模式,就可以在需要的時候才建立物件。另外全域性變數可能指向多個物件,這違反了例項唯一性。

單例模式確保乙個類有且僅有乙個例項,並提供乙個全域性變數。類圖如下:

單例模式典型例子強調三點:1、定義私有靜態全域性變數,2、私有化構造器,3、用getinstance()方法例項化物件,並返回這個例項。

**如下:

但是,如果遇到多執行緒,那麼上述**的例項物件就不是唯一的了。就如同下圖所示情況,例項化了兩個物件。

我們可以把getinstance方法變成synchronized方法,如下**所示:

然而同步會降低效能,另外只有第一次執行此方法時,才需要同步。換句話說,一旦設定好uniqueiinstance變數,就不再需要同步方法了,之後每次呼叫這個方法都是一種累贅。

不同場景下,你需要做出選擇,如果getinstance()的效能不是很關鍵,那麼使用同步方法無可厚非。但你需要知道的是:同步乙個方法會造成程式執行效率下降100倍。因此getinstance()使用頻繁的場景就不能使用同步方法了。

這時候如果在建立和執行時方面的負擔不太繁重,你可以在靜態初始化器中建立單例,這保證了執行緒安全。我們依賴jvm在載入這個類時馬上建立單例。jvm保證在任何執行緒訪問uniqueinstance靜態變數之前,一定先建立此例項。**如下:

如果效能是你關注的重點,那麼你可以採用dcl來幫你大大減少getinstance()的耗時,該方法首先檢查例項是否已經建立,如果尚未建立才同步。

volatile關鍵字保證了高併發下其被建立後會立即更新到jvm主存中,其被讀取也是執行緒立即到主存中去讀取,而不經過執行緒的快取,保證了例項的狀態在任何時刻都是最新的,volatile關鍵字的作用詳見volatile關鍵字的作用

獨一無二的單例模式

單例模式被定義為 確保乙個類只有乙個例項,並提供乙個全域性訪問點。單例模式使得乙個類只能有唯一的乙個例項,這意味著不能再使用new關鍵字建立物件,因為一旦可以被new,就可以被多次new。問題1 如何保證乙個類只有乙個例項?問題2 不能使用new如何獲取物件?這兩個問題的答案非常簡單 由於new物件...

單例模式 建立獨一無二的物件

單例模式 singleton pattern 用來建立獨一無二的,只能有乙個例項的物件的入場券。作用 有些物件我們只需要乙個,比如 執行緒池 快取 對話方塊 處理偏好設定 登錄檔等物件,這些物件只能有乙個例項,如果製造出多個例項,就會導致很多問題產生,例如 程式行為異常 資源使用過量 或者是不一致的...

設計模式系列 搞懂單例模式,我獨一無二

單例模式的定義 乙個類只有乙個例項,且該類能自行建立這個例項,並提供乙個訪問該單例的全域性訪問點。屬於建造型模式。單例模式的實現 餓漢式單例 類載入的時候即初始化並建立單例物件。適用於單例物件較少的情況。public class hungrysingleton public static hungr...