JAVA設計模式 單例模式

2021-07-11 23:47:48 字數 2198 閱讀 7198

目錄

一、什麼是單例模式

二、單例模式的應用場景

三、單例模式實現

餓漢式 

懶漢式雙重檢查

四、單例模式的特點

單例(singleton)模式是一種物件建立型模式,保證乙個類只有乙個例項存在,同時該類提供能對該例項加以訪問的全域性訪問方法。

單例模式的本質:控制例項個數

設計意圖:使用單例模式,可以保證為乙個類只生成唯一的例項物件。也就是說,在整個程式空間中,該類只存在乙個例項物件。 

如果碰到以下情況,可以考慮使用單例模式:

- 在多個執行緒之間,比如servlet環境,需共享同乙個資源或者操作同乙個物件。

- 在整個程式空間使用的全域性變數,共享資源等。

- 大規模系統中,為了效能的考慮,需要節省物件的建立時間,等等...。  

1.餓漢式。

2.懶漢式。

3.雙重檢查。 

為保證單例類只能建立唯一例項需將該類的構造方法私有化以防止其他類通過構造方法顯式建立單例類例項,另外單例類需對外提供乙個公共的全域性訪問方法以使其他類可以通過該方法獲取到單例類的唯一例項,餓漢式簡單示例**如下。 

public class singleton 

/*** 靜態的全域性訪問方法

*/public static singleton getsingleton()

}

在餓漢式中,在類載入時,靜態變數singleton會呼叫類的私有構造方法進行初始化。這時候,單例類的唯一例項就被建立出來了。

餓漢式是典型的空間換時間,當類裝載的時候就會建立類的例項,不管你用不用,先建立出來,然後每次呼叫的時候,就不需要再判斷,節省了執行時間。

與餓漢式不同,懶漢式唯一例項採取了延遲例項化的方法,先不建立例項,等到需要用到例項的時候再建立。真的很懶,有木有?其**示例如下。

public class singleton 

/*** 靜態的全域性訪問方法

*/public static singleton getsingleton()

return singleton;

}}

懶漢式是典型的時間換空間,就是每次獲取例項都會進行判斷,看是否需要建立例項,浪費時間去判斷。當然,如果一直沒有人使用的話,那就不會建立例項,則節約記憶體空間。

既然上述懶漢式singleton類在多執行緒中是不安全的,可以通過將getsingleton()方法同步化來解決,**如下:

public class singleton 

/*** 靜態的全域性訪問方法

*/public static synchronized singleton getsingleton()

return singleton;

}}

這樣singleton類雖然解決了執行緒安全問題,可又帶來了新的問題,由於getsingleton()方法被同步化,當多個執行緒同時需要獲取singleton例項時只能乙個乙個執行緒排隊執行,這樣會降低整個訪問的速度。

那麼,有沒有一種辦法可以既可以實現懶漢式的延遲例項化,又執行緒安全且不會降低整個系統的訪問速度呢?答案是:雙重檢查。

雙重檢查單例模式的產生是為了解決懶漢式單例模式同步化後系統執行效率慢的問題,其**示例如下,

public class singleton 

/*** 靜態的全域性訪問方法

*/public static singleton getsingleton()

}} return singleton;

}}

所謂的雙重檢查即:呼叫getsingleton()方法時先檢查singleton例項是否已被建立,如果未建立才進入同步塊,這是第一重檢查,進入同步塊之後再次檢查確認singleton例項是否已被建立,如果真的未被建立才建立例項,這是第二重檢查。這樣一來,同步只在第一次呼叫getsingleton()方法singleton==null時進行,之後每次獲取例項都無需進行同步判斷,減少了同步判斷浪費的時間。

「雙重檢查」機制的實現使用了關鍵字volatile,它的意思是:被volatile修飾的變數的值,將不會被本地執行緒快取,所有對該變數的讀寫都是直接操作共享記憶體,從而確保多個執行緒能正確的處理該變數。

單例類只能有乙個例項。

單例類必須自己建立自己的唯一例項。

單例類必須向整個系統提供對該例項加以訪問的全域性訪問方法。  

Java設計模式 單例模式

單例模式 singleton 顧名思義,就是乙個類只有乙個例項。作為物件的建立模式,單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。顯然單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。從具體...

java設計模式 單例模式

這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單 一 獨苗的意思,那什麼是獨乙份呢?你的思維是獨乙份,除此之外還有什麼不能山寨的呢?我們舉個比較難複製的物件 皇帝中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這...

java設計模式 單例模式

單例模式介紹 單例模式分 懶漢式單例 餓漢式單例。單例模式有一下特點 1 單例類只能有乙個例項。2 單例類必須自己自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。單例有併發問題,只有乙個例項,多個執行緒就可能同...