單例模式Singleton 你是唯一

2021-07-24 05:05:25 字數 2345 閱讀 9448

單例模式singleton 你是唯一

單例模式:確保指定類有且只有乙個物件,並提供乙個全域性的訪問點。

* 懶漢式,建立時判斷物件例項為空,則建立

* * @author k

* */

public

class singlea

// 靜態方法返回物件例項

public

static singlea newinstance()

return minstance;}}

/***

* 餓漢式單例模式

* *@author k

* */

public

class

singleb

// 靜態方法返回物件例項

public

static singleb newinstance()

}

上面兩種方式的實現單例模式,總結:

1. 私有化建構函式

2. 定義私有並靜態的類物件

3. 提供靜態方法返回該物件

懶漢模式中,每次newintance建立時,會先判斷物件是否為空,如果為空則會通過呼叫私有建構函式例項化物件並賦值。那麼問題來了,如果在多執行緒中通過newintance建立物件時,可能就出現執行緒1判斷minstance=null,在例項化物件並賦值之前,執行緒2也開始newintance,執行緒2中 判斷minstance=null,則再次例項化物件並賦值,這種方式是執行緒不安全的,不滿足單例模式有且只有乙個物件的原則。

測試結果如下:

// 靜態方法返回物件例項

public

static singlea newinstance()

return minstance;

}

/***

* 多執行緒單例例項化測試

*/private

static

void

multiplethreadsingletontest()

}).start();

new thread(new runnable()

}).start();}}

觀察列印結果:發現不止建立了乙個物件

解決問題多執行緒不安全,採用執行緒同步鎖即可解決該問題,改造後**如下

// 靜態方法返回物件例項,方法上synchronized同步鎖

public

static

synchronized singlec newinstance()

return minstance;

}

測試發現newinstance方法上加上synchronized同步方法後,可以多執行緒下建立物件有且只有乙個

缺點是:每次呼叫newinstance方法都進行同步,造成了不必要的開銷,效能下降。

先判斷例項物件是否為空,避免不必要的同步

在例項為null的情況下建立例項,使用synchronized同步,避免多執行緒不安全的問題

// double checklock單例模式

public

static singled newinstance() }}

return minstance;

}

上面double checklock單例模式,可以解決多執行緒同步,效能問題,但小概率範圍內也可能出現例項化失效的問題。

採用靜態內部類的方式實現單例模式,看上去似乎更像「餓漢式」模式,實際上當第一次載入singlee類是不會初始化minstance,只有在第一次呼叫newinstance()方法是才會初始化,也就是只有在第一次呼叫newinstance()虛擬機器才載入靜態內部類singleholoder,這種方式執行緒安全,能保證物件的唯一性,推薦使用。

/***

* 靜態內部類單例模式

* *@author k

* */

public

class

singlee

// 靜態內部類 建立

public

static

class

singleholoder

public

static singlee newinstance()

}

Singleton 單例 模式

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

Singleton 單例 模式

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

單例(Singleton)模式

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