單 :唯一 例:例項
某個類在整個系統只有乙個例項物件,可以獲取和使用的**模式;
要點:
必須自行建立這個例項
對外提供獲取該例項物件方式
直接暴露
用靜態變數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...
設計模式 單例設計模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...