理解設計模式之單例模式 一

2021-09-26 04:28:34 字數 2448 閱讀 9239

目錄定義

單例的作用

生活中的單例

**示例

單例分類

系統中某個物件有且只有乙個例項,當這個例項建立之後我們不能也無法再次建立這個物件的例項,所有的操作只能基於這個唯一的例項。

使用單例模式的最大意義在於,確保不會針對乙個物件建立多個例項,保證物件引用的唯一性和一致性。

windows系統中的任務管理器,我們每次呼叫系統任務管理器的時候無論敲多少次ctorl+alt+del,始終只有乙個任務管理器介面,再比如大學學校的班級指導員,每個班有且只有乙個指導員,不可能存在兩個指導員同時管理班級工作。

常用的方式

/***

* 常用方式,多執行緒模式下存在安全隱患

* @return

*/public static singleinstance getsingleinstance()

return singleinstance;

}

這種方式在多執行緒程式設計中存在安全問題,比如有兩個執行緒a和執行緒b,兩個執行緒都需要獲取singleinstance例項,如果a執行緒執行完singleinstance==null的判斷語句但是還沒有完成例項化時執行緒b也執行到這裡,這個時候singleinstance還是null,就會出現執行緒a和執行緒b都建立了singleinstance例項的情況,這就違反了單例模式的設計初衷。

解決上面的問題有兩種方案:餓漢單例和懶漢單例。

餓漢單例

餓漢單例是實現起來最簡單的方式,其**如下:

private static singleinstance singleinstance = new singleinstance();

private singleinstance()

/***

* 餓漢模式

* @return

*/public static singleinstance getinstance()

從**可以看出,餓漢模式在類載入的時候就已經對singleinstance的例項進行了初始化,當我們呼叫getinstance()的時候就會把預先初始化的例項返回給呼叫者。

懶漢單例

懶漢單例模式主要從同步鎖的角度來解決普通單例模式在多執行緒程式設計中存在的問題,根據使用鎖的位置不同可以分為三個版本。

版本1 在getinstance()方法上新增方法級的同步鎖,**如下:

private static singleinstance singleinstance2 = null;

/***

* 懶漢模式1

* @return

*/public synchronized static singleinstance getinstance()

return singleinstance2;

}

這種模式在方法級別通過新增鎖來解決執行緒安全問題,但是每次呼叫getinstance()都要進行執行緒鎖定判斷,高併發情況下會有比較大的效能消耗。

版本2 在版本1的基礎上稍加修改,既然版本1中每次都要在方法級別進行執行緒鎖判定,我們可以把執行緒鎖移到getinstance方法的**塊中使用同步**塊替代方法級別的執行緒鎖。**如下:

/***

* 懶漢模式2,方法內部使用同步**塊

* @return

*/public static singleinstance getinstance()

}return singleinstance2;

}

這種方式看上去已經很完美了,然而依然會出現上文的執行緒安全問題,原因是類似的。當a、b兩個執行緒都執行完singleinstance2==null這個判斷時,如果a執行緒比b執行緒先執行後面建立例項的邏輯,由於新增了鎖,此時b執行緒是處於排隊等候a釋放鎖的狀態。等a執行完了建立例項的過程之後,鎖被釋放,b執行緒開始繼續執行,這時候b執行緒已經判斷了singleinstance2==null,並且不知道singleinstance2已經被a執行緒例項化了,所以b執行緒會再次例項化乙個singleinstance2,這種情況同樣違反了單例模式的單一例項原則。

終極方案:基於版本2 在其基礎上進行改進,在版本2的同步**塊內部再次判斷singleinstance2是否為空,**如下:

/***

* 懶漢模式3,方法內部使用同步**塊,新增雙重判斷

* @return

*/public static singleinstance getinstance()}}

return singleinstance2;

}

當b執行緒獲取物件鎖然後開始準備建立例項的時候先判斷一下singleinstance2是否為空,如果singleinstance2不為空,說明已經被例項化,就不再執行例項化的操作了。

設計模式之單例模式理解

單例,從名字上面就可以看出來,首先他肯定是乙個類例項,然後他同時只能允許乙個訪問,那麼這樣才構成了乙個單例,單例模式在我們實際開發中應用非常廣泛,比如我們建立了乙個資料庫連線池,然後又建立了乙個工具類把這個連線池與執行緒進行繫結,那麼我們就可以實現基於執行緒來實現對事務管控,資料庫連線是多次的,但是...

理解設計模式 單例模式

定義 確保要建立的類只有乙個例項 對於頻繁建立的物件,可以省略其建立時間,同時可以減輕gc的壓力 避免對共享資源的多重占用 使用場景 單例模式寫法很多,這裡列舉以下三種 1 最簡單的寫法 使用列舉物件public enum singletonenum使用列舉還可以避免反射獲取類的私有構造方法從而建立...

設計模式 理解單例設計模式

設計模式分類 結構型行為型 建立型 單例模式屬於建立型設計模式 單例模式主要使用在 日誌記錄 將多項服務的日誌資訊按照順序儲存到乙個特定日誌檔案 資料庫操作 使用乙個資料庫物件進行操作,保證資料的一致性 印表機後台處理程式 以及其他程式 該程式執行過程中 只能生成乙個例項 避免對同一資源產生相互衝突...