單例設計模式

2021-10-25 22:03:36 字數 2793 閱讀 2850

單 :唯一 例:例項

某個類在整個系統只有乙個例項物件,可以獲取和使用的**模式;

要點:

必須自行建立這個例項

對外提供獲取該例項物件方式

直接暴露

用靜態變數get方法獲取

直接例項化餓漢式(簡潔直觀)

列舉式(最簡潔)

靜態**塊餓漢式(適合複雜例項化)

執行緒不安全(適用於單執行緒)

執行緒安全(適合於多執行緒)

靜態內部類形式(適用於多執行緒)

餓漢式直接建立

直接建立例項物件,不管是否需要直接建立

構造器私有化

自行建立,並且靜態變數儲存

向外提供這個例項

強調單例,用fina修改

public

class

singleton

private

static

final singleton singleton =

newsingleton()

;/**

* 獲取singleton例項,也叫靜態工廠方法

* @return singleton

*/public

static singleton getinstance()

}

適用靜態**塊

public

class

singleton

private

singleton()

}

列舉

列舉型別,表示該型別的物件是有限幾個

可以限定乙個,成就單列

public

enum singleton2

延遲建立這個例項物件

構造器私有化

用乙個靜態變數儲存這個唯一例項

提供乙個靜態方法,獲取這個例項物件

public

class

singleton

public

static singleton getinstance()

return instance;

}}

多執行緒不安全,加鎖

public

class

singleton

public

static singleton getinstance()

}return instance;

}}

上面方式解決了執行緒問題,但是出現了併發效能問題,

比較差,應該做些優化,如果沒有例項物件進行加鎖建立,如果已經有了不需要加鎖,直接獲取例項。

雙重檢查 + lock方式

public

class

singleton

public

static singleton getinstance()

}}return instance;

}}

執行流程

多執行緒搶鎖,只有乙個執行緒成功,再次判斷是否為空(因為可能被之前執行緒例項化了),再看看建立物件

其它執行緒看到不為空後,就不會獲取鎖了

引發另乙個問題:指令重排

jvm在保證最終結果正確的情況下,可以不按照程式編碼的順序執行語句,盡可能提高程式的效能

在這三步中,第2、3步有可能會發生指令重排現象,建立物件的順序變為1-3-2,會導致多個執行緒獲取物件時,有可能執行緒a建立物件的過程中,執行了1、3步驟,執行緒b判斷singleton已經不為空,獲取到未初始化的singleton物件,就會報npe異常。

使用volatile關鍵字可以防止指令重排序使用volatile關鍵字修飾的變數,可以保證其指令執行的順序與程式指明的順序一致,不會發生順序變換,這樣在多執行緒環境下就不會發生npe異常了

volatile還有第二個作用:使用volatile關鍵字修飾的變數,可以保證其記憶體可見性,即每一時刻執行緒讀取到該變數的值都是記憶體中最新的那個值,執行緒每次操作該變數都需要先讀取該變數。

public

class

singleton

public

static singleton getinstance()

}}return instance;

}}

靜態內部類方式 ,

保持多執行緒安全,和延遲載入效果

在內部類被載入和初始化時,才會建立instance例項物件,靜態內部類不會自動隨著外部類的載入和初始化而初始化,單獨的去載入和初始化。因為內部類載入和初始化時,建立它,執行緒安全。

public

class

singleton

private

static

class

inner

public

static singleton getinstance()

}

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

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

設計模式 單例設計模式

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

設計模式 單例設計模式

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