單例設計模式

2021-10-24 01:34:35 字數 2179 閱讀 8421

優缺點和應用場景

定義:顧名思義,單例(單個例項),即乙個類中只能有乙個例項(物件),使得類的乙個物件成為系統中的唯一例項

1.懶漢式:在類載入時,不建立例項,所以類載入速度快,但執行時獲取物件的速度慢

2.餓漢式:在類載入時就完成了初始化,所以類載入較慢,但獲取物件的速度快

餓漢式(執行緒安全)

class

singleton

// 建立物件

private

static singleton instance =

newsingleton()

;// 提供可供獲取物件的方法

public

static singleton getinstance()

}

public

class

singletondemo01

}

注:之後的main()方法測試都省略…

懶漢式(執行緒不安全),下列**將通過多執行緒操作演示

public

class

singletondemo})

;}}}

class

singleton

// 建立物件

private

static singleton instance = null;

// 提供可供獲取物件的方法

public

static singleton getinstance()

catch

(interruptedexception e)

if(instance == null)

return instance;

}}

思考:觀察上述**,假如多執行緒併發操作,真的滿足乙個類中只建立乙個例項的方法嗎?

->假設多執行緒同時操作呼叫getinstance()方法,thread-1執行緒此時判斷instance == null成立時,將要向下執行建立物件操作時可能會遭到阻塞造成此時進入就緒態。

thread-2執行緒判斷instance == null成立,開始進入②建立物件。而此時的thread-2執行緒也可能從就緒態到執行態,開始執行②。此時兩個執行緒返回的是兩個不同的物件,違反了單例模式的定義,怎樣解決呢?

懶漢式(優化成執行緒安全的單例模式,使用同步方法)

class

singleton

// 建立物件

private

static singletoninstance = null;

// 提供可供獲取物件的方法

// 新增synchronized變成同步方法

public

static

synchronized singleton getinstance()

return instance;

}}

思考:加鎖synchronized可以保證單例,但是效率高嗎?多執行緒情況下每次乙個執行完這個同步方法後另外乙個執行緒才能繼續執行,此時的效率效能是極低的。

其實只要能建立第乙個物件時才需要加鎖,後面的執行緒就不需要了。如何改進呢?

懶漢式(優化成執行緒安全的單例模式,使用雙重校驗鎖)

// 優化:使用同步**塊且在之前加入判空大大增加了效率

class

singleton

// 建立物件

private

static singleton instance = null;

// 提供可供獲取物件的方法

// 新增synchronized變成同步方法

public

static singleton getinstance()

}}return instance;

}}

1.缺點:沒有抽象層(介面),難於擴充套件…

2.優點:不需要頻繁的建立物件,減少記憶體的消耗…

3.使用場景:資料庫連線池,配置檔案的讀取,web中的計數器等

單例設計模式(餓漢單例設計模式 懶漢單例設計模式)

1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...

設計模式 單例設計模式

歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...

設計模式 單例設計模式

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...