單件模式(單例模式)

2021-07-10 09:59:44 字數 2953 閱讀 8500

readme

0.1)本文部分描述** 「head first 設計模式」, 旨在學習 單件模式(單例模式) 的相關知識 及其應用;

單件模式

1.0)單件模式的應用背景:有一些物件其實我們只需要乙個,比方說: 執行緒池,快取,對話方塊,登錄檔等的物件,這都可以通過單件模式來解決;

1.1)定義:確保乙個類只有乙個例項,並提供乙個全域性訪問點;

1.2)全域性變數的缺點:如果將物件賦值給乙個全域性變數,那麼你必須在程式一開始就建立好物件,對吧?萬一這個物件非常耗費資源,而程式在這次的執行過程中又一直沒有用到它,不就形成浪費了嘛?

(乾貨——使用全域性變數可能出現的問題)

剖析經典的單件模式實現

public class singleton 

public static singleton getinstance()

return uniqueinstance; }

// other useful methods here

public string getdescription()

}

對以上的**的分析(analysis):

a1)如果該物件不存在,我們就利用私有構造器產生乙個 singleton 例項並把它賦值到 uniqueinstance 靜態變數中。

a2)注意:如果我們不需要這個例項,它就永遠不會產生。這就是「延遲例項化」;

(乾貨——延遲例項化)

a3)看看它的類圖:

getinstance()方法是靜態的,這意味著它是乙個類方法,所以可以在**的任何地方使用 singleton.getinstance() 訪問它。這和訪問全域性變數一樣簡單,只是多了乙個優點: 單件可以延遲例項化;

併發訪問例項方法(處理多執行緒)3.0)多執行緒訪問例項方法所遇到的問題:返回了兩個不同物件object1 和 object2,多執行緒訪問的細粒度steps 如下所示:

3.1)把 getinstance() 變成同步(synchronized)方法,解決併發問題;

public class concurrencysingleton 

public static synchronized concurrencysingleton getinstance()

return uniqueinstance; }

// other useful methods here

public string getdescription()

}

3.2)加上 synchronized後的效能問題:顯然,這樣會降低同步的效能,這引入了另乙個問題;

問題詳述:這個問題比你想象的還要嚴重,因為只有第一次執行此方法時,才真正需要同步。換句話說,一旦設定好uniqueinstanc 變數, 就不再需要同步這個方法了。之後每次呼叫這個方法,同步都是一種累贅,顯著地降低了程式效能;(因為當多個執行緒併發訪問 getinstance 方法的時候,有且只有乙個執行緒能夠獲得同步鎖,訪問方法成功,某個執行緒訪問成功後,其他執行緒才有可能去訪問該方法,此時叫序列訪問而不是並行訪問了);

3.3)solution(多執行緒下的單件模式):

s1)如果getinstance() 的效能對應用程式不是很關鍵,就什麼也別做;(不用加 synchronized關鍵字);

s2)使用 急切建立例項,而不用延遲例項化的做法;

(乾貨——比較急切例項化和延遲例項化的區別)

public class singleton 

public static singleton getinstance()

s3)使用雙重檢查加鎖,在 getinstance()中減少使用同步:利用雙重檢查加鎖,首先檢查是否例項物件已經建立了,如果沒有建立,才進行同步。這樣一來,也就只有第一次才會同步,這正是我們想要的;(乾貨——我個人推薦使用這個加鎖機制)

public class concurrencysingletonv2 

// 只有第一次才執行全部**,否則跳轉到 return 語句行

public static concurrencysingletonv2 getinstance()

}} return uniqueinstance;

}}

attention)volatile 關鍵字:為例項域的同步訪問提供了一種免鎖機制, 如果說明乙個域為 volatile, 那麼編譯器和 虛擬機器就知道該域是可能被另乙個執行緒併發更新的;

單件模式(單例模式)

1 單件模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。2 經典的單件模式實現 public class singleton public static singleton getinstance return uniqueinstance 問題點 public static singleto...

單例模式(單件模式)

color red size medium 單件模式,就是確保乙個類只有乙個例項,並提供乙個全域性訪問點。size color 單例的作用是獨一無二,比方說,如果有乙個登錄檔設定的物件,你不希望這樣的物件有多個拷貝吧,那會把設定搞得一團亂,利用像單例這樣的單件物件,可以確保程式中使用的全域性資源只有...

5 單件模式(單例模式)

head first design patterns master src headfirst designpatterns singleton 獨一無二的物件 整個程式中只允許有乙個物件 如資料庫連線或者執行緒池 否則 程式行為異常,資源使用過量,或者導致不一致的結果 構造器是私有的,通過呼叫靜態...