單例模式(singleton)

2021-07-12 04:24:24 字數 1455 閱讀 4726

單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項,這個類稱為單例類,它提供全域性訪問的方法。

一是某個類只能有乙個例項;

二是它必須自行建立這個例項;

三是它必須自行向整個系統提供這個例項。

單例模式是一種物件建立型模式。

模式分析:

1.私有化構造方法。private singleton()

2.獲取例項的靜態方法。public static singleton getinstance()     //因為沒有具體的例項,所以只能通過類去呼叫這個方法,就必須加static.

3.定義儲存例項的屬性。private static singleton instance = null;  //因為要在上面靜態方法裡面使用,所以必須加static.

完整實現:

public class singleton 

//2:定義乙個方法來為客戶端提供類例項

//3:這個方法需要定義成類方法,也就是要加static

public static singleton getinstance()

如果有值,那就直接使用

return instance;

}}

問題:如果應用程式是多執行緒應用程式

如果在首次呼叫 getinstance()時,是由兩個執行緒同時呼叫的(這種情況是很常見的)。

乙個執行緒進入 if 判斷語句後但還沒有例項化 singleton 時,第二個執行緒到達,此時 singleton 還是為 null,這樣的話,兩個執行緒均會進入 getinstance(),問題就出來了,因為有兩個執行緒,所以會建立兩個例項。

解決:先將乙個執行緒鎖定,然後等這個執行緒完成以後,再讓其他的執行緒訪問 getinstance()中的 if 段語句,if(instance == null)

public class singleton

public static singleton getinstance()}}

return singleton;

}}

效能問題!

如果沒有第一重 singleton == null 的話,每一次有執行緒呼叫getinstance()時,均會執行鎖定操作來實現執行緒同步,這是非常耗費效能的。

而如果加上第一重 singleton == null 的話,那麼就只有在第一次,也就是 singleton ==null 成立時的情況下執行一次鎖定以實現執行緒同步,而以後的話,便只要直接返回 singleton 例項就 ok 了而根本無需再進入 lock 語句塊了,這樣就可以解決由執行緒同步帶來的效能問題了。

懶漢式單例,餓漢式單例。

懶漢就上面那種。

餓漢

public class singleton

public static singleton getinstance()

}

Singleton 單例 模式

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

Singleton 單例 模式

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

單例(Singleton)模式

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