實現方式大致分為兩種
懶漢模式:在第一次使用該物件時,才會初始化例項,以免了資源的浪費,同時,需要考慮的是執行緒安全問題。
餓漢模式:在類初始化時就需要建立乙個例項物件出來,當時並不一定會使用該物件,可能會造成資源的浪費,好處是不用考慮安全問題。
下面看下幾種常見的實現方式:
首先看懶漢模式:
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錯誤 因為建立物件需要呼叫構造方法執行 構造方法執行在棧記憶體中 每次建立物件需要載入屬性 該屬性又是當前類物件 造成無限迴圈建立物件 最終棧記憶體壓滿 ...