單例模式(SingleTon)總結

2021-10-06 07:33:51 字數 3113 閱讀 6004

所謂單例模式,就是採取一定的方法保證在整個軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法(靜態方法)。

單例模式的8種方式:

餓漢式(靜態變數)

餓漢式(靜態**塊)

懶漢式(執行緒不安全)

懶漢式(執行緒安全,同步方法)

懶漢式(執行緒安全,同步**塊)

雙重檢查

靜態內部類

列舉建立餓漢式(靜態變數)單例模式的步驟如下:

構造器私有化(防止外部new);

類的內部建立物件;

向外部暴露乙個靜態的公共方法;(getinstance)

**實現如下:

//餓漢式(靜態變數)

class

singleton

;//2.本類建立乙個物件例項

private

static singleton instance =

newsingleton()

;//3.提供乙個共有靜態方法,返回例項物件

public

static singleton getinstance()

}

優缺點:

優點:寫法簡單,在類裝載時完成例項化,避免了執行緒同步問題。

缺點:在類裝載時完成例項化,沒有達到lazy loading的效果。

總結:這種單例模式可用,可能造成記憶體浪費。

建立餓漢式(靜態**塊)單例模式的步驟和上述類似,只是例項化放在靜態**塊中:

**實現如下:

//餓漢式(靜態**塊)

class

singleton

;//2.本類建立乙個物件

private

static singleton instance;

//3.在靜態**塊中,建立單例物件

static

//4.提供乙個共有靜態方法,返回例項物件

public

static singleton getinstance()

}

優缺點和餓漢式(靜態變數)相同。

**實現如下:

//懶漢式(執行緒不安全)

class

singleton

;//2.本類建立乙個物件

private

static singleton instance;

//3.提供乙個共有靜態方法,當使用到該方法實,才去建立instance

public

static singleton getinstance()

return instance;

}}

優缺點:

起到了lazy loading的效果,但是只能在單執行緒下使用。

在多執行緒下,可能多個執行緒同時進入if判斷語句,則會產生多個例項。

在實際開發中,不能使用該方式。

//懶漢式(執行緒安全,同步方法)

class

singleton

;//2.本類建立乙個物件

private

static singleton instance;

//3.提供乙個共有靜態方法,加入同步處理的**,解決執行緒不安全問題。

public

static

synchronized singleton getinstance()

return instance;

}}

優缺點總結:

解決了執行緒不安全問題。

效率太低,每個執行緒在獲得例項的時候,執行getinstance方法都要進行同步,而這個方法實際上只需要執行一次例項化**就夠了。

在實際開發中,不推薦使用該方法。

實際上該方法依然是不安全的。

//懶漢式(執行緒安全,同步**塊)

class

singleton

;private

static singleton instance;

public

static singleton getinstance()

}return instance;

}}

總結:不能使用這種方式

使用volatile解決指令重排問題。

//雙重檢查

class

singleton

;private

static

volatile singleton instance;

public

static singleton getinstance()

}}return instance;

}}

優缺點說明:

double-check概念是多執行緒開發中經常使用到的,通過volatile關鍵字和兩次if判斷,直接return例項化物件,也避免了反覆進行方法同步。

執行緒安全,lazy loading 效率較高。

**實現如下:

//靜態內部類完成,推薦使用

class

singleton

;private

static

class

singletoninstance

public

static singleton getinstance()

}

分析:只有取singletoninstance.instance時,才會使靜態內部類被裝載。實現lazy loading。(使用了jvm內部的底層裝載機制)

優缺點分析:

這種方法採用了類裝載的機制保證初始化例項時只有乙個執行緒。

靜態內部類在singleton被裝載時不會立即例項化。

類的靜態屬性只會再第一次載入類的時進行例項化。因此jvm保證了執行緒的安全性。在類進行初始化時,別的執行緒是無法進入的。

結論:推薦使用。

enum singleton 

}

Singleton 單例 模式

singleton 模式的宗旨在於確保某個類只有乙個例項,別且為之提供乙個全域性訪問點。為了防止其他工作人員例項化我們的類,可以為該類建立唯一乙個構造器,並將構造器的可見 設定為私有。值得注意的是,如果我們建立了其他的非私有的構造器,或者根本沒有為該類提 供構造器,那麼其他人員還是能例項化我們的類。...

Singleton 單例 模式

今天看了,單例模式。感覺他的本質就是,控制類例項的個數。特例就是,控制static變數的唯一性,保證各個程式共享著同一例項。乙個例子 package singleton description 這是乙個單例模式的使用demo author kyle goal 實現乙個類僅有乙個例項 singleto...

單例(Singleton)模式

單例模式的特點 singleton模式包含的角色只有乙個,那就是singleton。singleton擁有乙個私有建構函式,確保使用者無法通過new取得singleton的例項。除此之外,該模式中包含乙個靜態私有成員變數instance與靜態公有方法instance。instance方法負責檢驗並例...