單例模式的幾種實現方式

2022-04-12 01:46:29 字數 2667 閱讀 6282

實現方式大致分為兩種

懶漢模式:在第一次使用該物件時,才會初始化例項,以免了資源的浪費,同時,需要考慮的是執行緒安全問題。

餓漢模式:在類初始化時就需要建立乙個例項物件出來,當時並不一定會使用該物件,可能會造成資源的浪費,好處是不用考慮安全問題。

下面看下幾種常見的實現方式:

首先看懶漢模式:

1、執行緒非安全版本,可在單執行緒下使用

/**

* 懶漢式單例,執行緒不安全,只有在第一次呼叫時才會初始化一次,

* 但是執行緒不安全,如果在初始化時需要消耗大量的資源,則會造成資源的浪費,同時,在併發場景中,可能造成變數的變化等問題。

* @author

woniu *

*/public

class

singleton1

private

static singleton1 instance = null

;

public

static

singleton1 getinstance()

return

instance;

}}

關於懶漢模式的幾種執行緒安全版本,詳細的說明已在類中說明,不在單獨說明。

1、在getinstance方法上加同步

/**

* 懶漢式單例,執行緒安全,與第一種無異,僅是通過synchronized,將getinstance實現為了同步方法,

* 但是,這就造成了getinstance方法,僅能同時只有乙個執行緒呼叫,但是,在除去第一次初始化外,我們大多數情況下,並不需要防止同步問題。

* @author

woniu */

public

class

singleton2

private

static singleton2 instance = null

;

public

static

synchronized

singleton2 getinstance()

return

instance;

}}

2、雙重檢查鎖定

/**

* 此方法被稱為雙重校驗鎖,在示例2的基礎之上將同步方法,修改為了同步**塊,僅是在需要初始化時,才需要加鎖,這樣就避免了在大多數情況下不需要同步的問題。

* 關於之所以在同步方法塊中再次進行判斷的原因:根據併發程式設計實戰中的提到的「先檢查後執行」的操作是非原子性的,簡而言之就是,避免用乙個過期的變數作為當前的判斷標準。

* 連線:

* @author

woniu *

*/public

class

singleton3

private

volatile

static singleton3 instance = null

;

public

static

singleton3 getinstance()}}

return

instance;

}}

3、靜態內部類

/**

* 單例同樣可以通過內部類的方式實現,這樣就避免了同步帶來的效能開銷(雖說現在synchronize方法已經做了很大的優化,對效能的影響已經降低了很多,但終究還是有一定影響的。)

* 雖說這種方式比較好,但是在我們當前專案中,似乎大家都比較懶,直接用了方法2中的模式,畢竟,當前的工程性專案,並沒有對專案效能有極高的要求。

* @author

woniu *

*/public

class

singleton4

;

private

static

class

lasyholder

public

static

singleton4 getinstance()

}

餓漢模式:

/**

* 餓漢模式,通過在類初始化時,已經例項化,這樣本身就是執行緒安全的。

* @author

woniu *

*/public

class

singleton5

private

static

final singleton5 instance = new

singleton5();

public

static

singleton5 getinstance()

}

最後有一種通過列舉實現的方式,算是一種比較新的方式吧。當前不清楚具體歸屬型別,暫且單列出來。

/**

* 列舉模式,沒有使用過,僅是部落格或者書見過這種方式,不僅能避免執行緒同步問題,而且還能防止反序列化重新建立新的物件,日後工作中,有類似需要單例場景中,可以考慮使用一下,寫法還是十分簡單的。

* @author

woniu *

*/public

enum

singleton6

public

static

void

main(string args)

}

單例模式實現的幾種方式

單例模式三個主要特點 1 構造方法私有化 2 例項化的變數引用私有化 3 獲取例項的方法共有。package com.ctl.singleton 懶漢式單例 該模式的特點是類載入時沒有生成單例,只有當第一次呼叫 getlnstance 方法時才去建立這個單例 注意 如果編寫的是多執行緒程式,則不要刪...

單例模式的幾種實現方式

單例模式莫過於是我們最常用的設計模式之一了,它的優缺點就是 優也單例,缺也單例 當然應用它方面優點還是較多些的,所以下面我們看看,常用的幾種實現方式有哪些吧。這種是最基本的實現方式,最大的問題就是不支援多執行緒,由於沒有加鎖,嚴格上並不算單例模式。public class singleton pub...

單例模式的幾種實現方式

public class person private person person new person 出現stackoverflowerror錯誤 因為建立物件需要呼叫構造方法執行 構造方法執行在棧記憶體中 每次建立物件需要載入屬性 該屬性又是當前類物件 造成無限迴圈建立物件 最終棧記憶體壓滿 ...