Java設計模式(1) 單例模式

2021-08-19 18:23:48 字數 3004 閱讀 3908

singleton是一種建立型模式,指某個類採用singleton模式,則在這個類被建立後,只可能產生乙個例項供外部訪問,並提供乙個全域性的訪問點。

核心知識點:

1.將採用單例設計模式的類的構造方法私有化(採用private修飾)

2.在其內部產生該類的例項話物件,並將其封裝成private static型別

3.定義乙個靜態方法返回該類的例項

單例模式總體上來說,分為兩類:餓漢式和飽漢式(又叫懶漢式)

兩種模式的區別在於:是自己被載入時就將自己例項化(餓漢式)還是第一次被引用時才將自己例項化飽漢式(又叫懶漢式)

下面是針對單例模式寫的幾個實現方式的demo

方式一:

使用餓漢模式,**如下:

/**

* 單例模式實現方式一

* 餓漢式,執行緒安全,效率低

*@author liangxin

* */

public

class

singleton1

//將自身低乙個例項物件設定為乙個屬性,並加上static和final修飾符

private

static

final singleton1 instance = new singleton1();

//靜態方法返回該類的例項

public

static singleton1 getinstance()

}

優點:寫起來比較簡單,而且不存在多執行緒同步問題,避免了synchronized所造成的效能問題;

缺點:當類singleton被載入的時候,會初始化static的instance,靜態變數被建立並分配記憶體空間,從這以後,這個static的instance物件遍一直佔著這段記憶體(即便你還沒有用這個例項),當類被解除安裝時,靜態變數被摧毀,並釋放所占有的記憶體,因此在某些特定情況下會耗費記憶體。

方式二:

使用飽漢模式,**如下:

/**

* 方式二

* 飽漢式,非執行緒安全

*@author liangxin

* */

public

class

singleton2

//定義乙個singleton型別的變數(不初始化,注意這裡沒有使用final關鍵字

private

static singleton2 instance;

//定義乙個靜態的方法(呼叫是在初始化singleton,但是多執行緒訪問時,可能造成重複初始化問題)

public

static singleton2 getinstance()

}

優點:寫起來比較簡單,當類singleton唄載入的時候,靜態變數static的instance違背建立並分配記憶體空間,當getinstance方法第一次被呼叫時,初始化instance變數,並分配記憶體,因此在某些特定情況下會節約記憶體

缺點:併發環境下很可能出現多個singleton例項,

方式三

是方法二的簡單優化,增加對多執行緒對支援

/**

* 方式三

* 飽漢式的優化公升級版,飽漢式,執行緒安全簡單實現

*@author liangxin

* */

public

class

singleton3

//定義乙個singleton型別的變數(不初始化,注意這裡沒有使用final關鍵字)

private

static singleton3 instance;

//定義乙個靜態方法(呼叫時在初始化singleton,使用synchronized避免多執行緒訪問時,可能造成重複初始化問題

public

static

synchronized singleton3 getinstance()

}

優點:使用synchronized關鍵字避免多執行緒訪問時,出現多個singleton例項

缺點:同步方法頻繁呼叫時,效率略低

方式四:

雙重鎖定,單例模式最佳實現,使用該方式,可使記憶體占用低,效率高,執行緒安全,多執行緒操作原子性

/**

* 單例模式最佳實現

* 記憶體占有低,效率高,執行緒安全,多執行緒操作原子性

*@author liangxin

* */

public

class

singleton4

//定義乙個靜態私有變數(不初始化,不使用final關鍵字,使用volatile保證了多執行緒訪問時instance變數的可見性,

//避免了instance初始化時其他比**屬性還沒賦值完時,被另外執行緒呼叫

private

static

volatile singleton4 instance;

//定義乙個共有的靜態方法,返回該型別例項

public

static singleton4 getinstance() }}

return instance;

}}

方法四的實現使用了雙重鎖定,我們在使用該物件時,不用讓執行緒每次都加鎖,而只是在例項未被建立的時候在加鎖處理,同時也能保證多執行緒的安全,這種做法被稱為double-checklocking(雙重鎖定)

對於方法四中為何要使用兩個為空判斷:

對於instance存在的情況,就不會進入該段邏輯,直接返回,ok,這是沒問題的,但是當instance為null,並且同時有兩個執行緒呼叫getinstance()方法時,他們將都可以通過第一重的instance == null判斷,然後由於synchronized機制,這兩個執行緒只有乙個進入,另乙個在外排隊等待,必須要其中乙個進入並出來之後,另乙個才能進去,而如果沒有第二重的instance == null判斷,則第乙個執行緒次建立了例項,而第二個執行緒還是可以繼續建立新的例項,這樣就沒有達到單例的目的

Java設計模式1 單例設計模式

1 為什麼設計成單例模式?保證類在記憶體中只有乙個物件。例如 runtime類 在計算機系統中,執行緒池 快取 日誌物件 對話方塊 印表機 顯示卡的驅動程式物件常被設計成單例。2 單例模式設計的3種方式 1 餓漢式 推薦使用 public class singleton 2,建立本類物件,定義sta...

Java設計模式筆記(1)單例模式

單例模式 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。package com.juno.singlepattern 餓漢式單例,通用 建議 public class singletonone public static singletonone getinstance publ...

java設計模式之單例模式(1)

單例模式 屬於建立型模式。專案中只存在某個類的乙個物件,而且只可能存在乙個物件。那麼我們說這個類是單例模式,也叫單態模式。單例模式分為兩種 懶漢式 和 餓漢式。package com.pattern.build.singleton 餓漢式 author chuer date 2014 7 17 下午...