設計模式 1 單例模式概念要點及例子說明

2021-10-09 23:14:07 字數 1963 閱讀 7946

0. 要點:

私有構造方法

本類中提供乙個靜態本類物件

對外提供乙個獲取例項的方法

1. 雙重校驗的單例模式:
該方式的單例模式是基於懶漢式的單例模式

雙重校驗能保證執行緒安全,且避免每次獲取物件都去synchronized加鎖,只有單例物件為null時才去加鎖建立例項物件

此外靜態物件要加volatile修飾,這樣能夠禁止jvm的指令重排;

在14行new建立例項物件時,jvm會先為物件分配空間,然後初始化物件,再將物件引用賦給singleton

但是初始化和引用賦值由於編譯器、cpu等因素會進行指令重排,使得先引用賦值再初始化

這樣在多執行緒的時候,一條執行緒剛引用賦值未初始化完,另一條執行緒訪問getinstance,由於singleton不為null就直接返回例項物件了,但由於其未初始化,其在使用時會有空指標風險

public

class

lazysingleton

}public lazysingleton getinstance()

}}return singleton;

}}

對私有建構函式,需要對其丟擲異常,避免反射的時候建立例項物件

1. 餓漢式:
在類載入的時候,例項物件就被建立出來了;通過類載入機制來保證執行緒安全,(類載入過程只會進行一次)

public

class

hungrysingleton

public

static hungrysingleton getinstance()

}

懶漢式與餓漢式,最大區別就是記憶體使用和執行緒安全方面

懶漢式在使用的時候才建立,當然,不使用就不會建立,就節省不必要的記憶體空間

餓漢式在類載入時就建立了,不管使不使用,當佔據記憶體空間

此外,餓漢式本身是執行緒安全的,懶漢式需要做好執行緒安全方面的處理

此外,對於懶漢式的執行緒安全處理,除了雙重校驗鎖之外,還有靜態內部類和列舉單例等方式

2. 靜態內部類單例模式:
在靜態內部類innerclassholder中才建立innerclasssingleton例項物件

·靜態內部類,只有在被getinstance呼叫的時候,才會進行類載入,類載入後便建立了例項物件,與餓漢式單例模式有異曲同工之妙

public

class

innerclasssingleton

public

static innerclasssingleton getinstance()

private

static

class

innerclassholder

}

3. 列舉單例模式:
列舉類的單例,本身也是執行緒安全的,且能夠天然的避免反射建立例項,還支援反序列回同乙個物件

public

enum enumsingleton

}

上述單例模式,除了列舉單例,其他的單例模式在實現序列化介面,在反序列時,反序列化回的物件不是同乙個物件

可以通過新增object readresolve() throws objectstreamexception方法來解決

public object readresolve()

throws objectstreamexception

設計模式1 單例模式

文章引用出處 singleton模式是最簡單最常用的設計模式。1,定義 確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個該類。2,單例模式優點 1 單例模式在記憶體中只有乙個例項,減少了記憶體的開支。2 單例模式只生成乙個例項模式,減少了系統效能的開銷。如當乙個物件的產生需要比較多的系統資...

設計模式1 單例模式

單例模式,利用工廠類只生產乙個例項或者有限個例項,比如乙個系統中只有乙個主機板,乙個顯示卡,但是有些系統中也可以存在多個,雙顯示卡,雙顯示器等等。這些在singleton module中都是可以定義的。當然我們也可以使用全域性的變數或者靜態類或者物件去做,但是單例模式的存在是有其優點的。public...

設計模式1 單例模式

保證乙個類只有乙個例項 即乙個物件,並且提供乙個訪問該例項的全域性訪問點 即類中有乙個公共的方法 方法的返回該類的物件。1.windows的任務管理器 無論開啟多少次都只能開啟乙個視窗 2.windows的 站 3.專案中的配置檔案 4.的計數器 5.日誌 6.連線池 8.spring的bean 預...