單例模式(SingletonPattern)

2021-09-25 08:00:07 字數 1439 閱讀 9950

摘要:

本文首先概述了單例模式產生動機,揭示了單例模式的本質和應用場景。緊接著,我們給出了單例模式在單執行緒環境下的兩種經典實現:餓漢式懶漢式,但是餓漢式是執行緒安全的,而懶漢式是非執行緒安全的。在多執行緒環境下使用雙重檢查模式。

類圖:單例模式有 3 個特點:

單例類只有乙個例項物件;

該單例物件必須由單例類自行建立;

單例類對外提供乙個訪問該單例的全域性訪問點;

使用場景:

1.資料庫連線池的連線類

2.工具類

3.配置的bean中的方法預設都為餓漢式單例,在專案啟動的時候就已經生成了乙個例項

4.配置檔案資料的讀取,比如你的工程需要讀取配置檔案,一般情況下你會寫個配置檔案的類,而這個類在整個工程裡只需要new一次,所有呼叫者都是用同乙個例項,那麼這個類就可以採用單例模式

併發情況下

餓漢式單例:

// 餓漢式單例

public class singleton1

// 以自己例項為返回值的靜態的公有方法,靜態工廠方法

public static singleton1 getsingleton1()

}

餓漢式單例在單例類被載入時候,就例項化乙個物件並交給自己的引用;而懶漢式單例只有在真正使用的時候才會例項化乙個物件並交給自己的引用。

懶漢式單例:

// 懶漢式單例

public class singleton2

// 以自己例項為返回值的靜態的公有方法,靜態工廠方法

public static singleton2 getsingleton2()

return singleton2;}}

從懶漢式單例可以看到,單例例項被延遲載入,即只有在真正使用的時候才會例項化乙個物件並交給自己的引用。

在多執行緒時候,使用單例模式進行雙重檢查鎖定:

// 執行緒安全的懶漢式單例

public class singleton3

public static singleton3 getsingleton3() }}

return singleton3;}}

當呼叫到單例模式時候,為了在保證單例的前提下提高執行效率,我們需要對 singleton3 進行第二次檢查,目的是避開過多的同步(因為這裡的同步只需在第一次建立例項時才同步,一旦建立成功,以後獲取例項時就不需要同步獲取鎖了)。這種做法無疑是優秀的,但是我們必須注意一點,必須使用volatile關鍵字修飾單例引用。使用單例模式的好處:在乙個應用程式中只能被例項化一次,可以很大程度的節省系統的開銷。

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...

單例模式 懶漢式單例模式

單例模式有餓漢時模式和懶漢式 單例模式也就是說同一類只返回乙個物件供外部類使用 懶漢式即延遲初始化單例。在多執行緒環境下,簡單的懶漢式會有執行緒安全。懶漢式單例模式解決線性安全問題如下 1 使用雙重檢查鎖機制解決執行緒安全問題。2 單例模式還有更好的解決方案,即使用靜態類方式。懶漢式單例模式典型 p...