5種單例模式

2021-10-24 21:32:13 字數 1908 閱讀 1023

5種單例模式

餓漢式靜態常量

class

singletondemo

public

static singletondemo getinstance()

}

靜態**塊

class

singletondemo

private singletondemo

public

static singletondemo getinstance()

}

優缺點:

優點:類載入時instance例項就被裝載進記憶體,而類裝載是乙個執行緒安全的過程,static變數和static**塊只會被裝載一次,所以餓漢式能夠保證執行緒安全

缺點:不管應用最終有沒有用到這個單例,該單例都會被裝載到記憶體中。這就有可能會造成記憶體浪費。

懶漢式沒有加鎖

class

singletondemo

public

static singletondemo getinstance()

return instance;

}}

優點:開啟懶載入模式,只有在需要用到該單例的時候才將該例項裝載到記憶體,避免了記憶體的浪費

缺點:無法保證執行緒安全性,因為沒有對例項化唯一單例的**加鎖,所以多執行緒程式設計下根本無法保證執行緒安全性,結果有可能建立了好幾個例項

2. 使用同步方法

class

singletondemo

public

static

synchronized singletondemo getinstance()

return instance;

}}

優點:在方法上加鎖可以保證執行緒安全

缺點:併發執行效率太低,單例只需要在第一次例項化時保證執行緒安全性即可,後續只需要獲取該唯一例項就行,此時不需要加鎖,此時加鎖會影響到執行緒的併發性。

使用同步**塊

class

singletondemo

public

static singletondemo getinstance()

}return instance;

}}

缺點:該寫法無法保證執行緒安全

雙重檢測

class

singletondemo

public

static singletondemo getinstance()

}}return instance;

}}

靜態內部類
class

singletondemo

private singletondemo

public

static singletondemo getinstance()

}

優點:利用內部靜態類在singletondemo初始化時並未將interior類裝載到記憶體中,所以並不會造成記憶體浪費。當呼叫getinstance方法時才將instance裝載到記憶體中,而將類裝載到記憶體這個過程是執行緒安全的,所以執行緒安全性也得以保障。推薦使用此種方式建立單例

列舉

enum singletondemo

}

//獲取單例的時候

singletondemo.instance

優點:既有懶載入的特性,又有執行緒安全性,除此之外最大的優點是可以防止反射和反序列化對單例的破壞

關於列舉單例以及反射和序列化對單例的破壞的具體內容可以參考以下兩篇部落格

設計模式之單例模式七(使用列舉類的最佳實踐)

解析——為什麼單元素的列舉型別是單例模式的最佳實現

23種設計模式 單例模式(5種)

常見應用場景 window中任務管理器就是典型的單例 window中 站 專案中,讀取配置檔案的類,一般也只有乙個物件,沒有必要每次使用配置檔案資料,每次new乙個物件去讀取 的計數器 保證同步 應用程式的日誌應用,資料庫連線池一般也是採用單例,因為資料庫連線也是一種資料庫資源 public cla...

單例模式(5種實現方式)

1.餓漢式 不支援併發 此模式只能執行在單執行緒下,且類在載入時就已經建立好了例項,不管需不需要用。package com.lys 餓漢式 public class singleton1 private static singleton1 instance new singleton1 public...

5種方式實現單例模式

破壞單例模式的方法及應對 使用場景 單例模式的核心是乙個類只允許有乙個例項化物件。spring物件池預設就是單例模式。如果生產環境下某類只需要也只允許有乙個例項化物件就可以考慮使用單例模式。實現單例模式的策略是 構造方法私有化,也就是外部不允許通過new的方式獲取物件,而是提供乙個公開的靜態方法供外...