單例模式 Singleton Pattern

2021-08-02 03:51:00 字數 2586 閱讀 1317

這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單

一、獨苗的意思,那什麼是獨乙份呢?你的思維是獨乙份,除此之外還有什麼不能山寨的呢?我們舉個比較難複製的物件:皇帝中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天、前天的一樣(過渡期的不考慮,別找茬哦),大臣磕完頭,抬頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,先看類圖:

然後我們看程式實現,先定乙個皇帝:

package com.cbf4life.singleton1;  

/**

* @author cbf4life [email protected]

* i'm glad to share my knowledge with you all.

* 中國的歷史上一般都是乙個朝代乙個皇帝,有兩個皇帝的話,必然要pk出乙個皇帝出來

*/

public class emperor

public static emperor getinstance()

return emperor;

} //皇帝叫什麼名字呀

public static void emperorinfo()

}

然後定義大臣:

package com.cbf4life.singleton1;  

/**

* @author cbf4life [email protected]

* i'm glad to share my knowledge with you all.

* 大臣是天天要面見皇帝,今天見的皇帝和昨天的,前天不一樣那就出問題了!

*/

@suppresswarnings("all")

public class minister

}

看到沒,大臣天天見到的都是同乙個皇帝,不會產生錯亂情況,反正都是乙個皇帝,是好是壞就這乙個,只要提到皇帝,大家都知道指的是誰,清晰,而又明確。問題是這是通常情況,還有個例的,如同乙個時期同乙個朝代有兩個皇帝,怎麼辦?單例模式很簡單,就是在建構函式中多了加乙個建構函式,訪問許可權是 private 的就可以了,這個模式是簡單,但是簡單中透著風險,風險?什麼風險?在乙個 b/s 專案中,每個 http request 請求到 j2ee的容器上後都建立了乙個執行緒,每個執行緒都要建立同乙個單例物件,怎麼辦?,好,我們寫乙個通用的單例程式,然後分析一下:

package com.cbf4life.singleton3;  

/**

* @author cbf4life [email protected]

* i'm glad to share my knowledge with you all.

* 通用單例模式--"懶漢式"

*/

@suppresswarnings("all")

public class singletonpattern

public singletonpattern getinstance()

return this.singletonpattern;

} }

我們來看紅色的那一部分,假如現在有兩個執行緒 a 和執行緒 b,執行緒 a 執行到 this.singletonpattern =new singletonpattern(),正在申請記憶體分配,可能需要 0.001 微秒,就在這 0.001 微秒之內,執行緒 b 執行到 if(this.singletonpattern == null),你說這個時候這個判斷條件是 true 還是 false?是 true,那然後呢?執行緒 b 也往下走,於是乎就在記憶體中就有兩個 singletonpattern 的例項了,看看是不是出問題了?如果你這個單例是去拿乙個序列號或者建立乙個訊號資源的時候,會怎麼樣?業務邏輯混亂!資料一致性校驗失敗!最重要的是你從**上還看不出什麼問題,這才是最要命的!因為這種情況基本上你是重現不了的,不寒而慄吧,那怎麼修改?有很多種方案,我就說一種,能簡單的、徹底解決問題的方案:

package com.cbf4life.singleton3;  

/**

* @author cbf4life [email protected]

* i'm glad to share my knowledge with you all.

* 通用單例模式---"餓漢式"

*/

@suppresswarnings("all")

public class singletonpattern

public synchronized static singletonpattern getinstance()

}

直接 new 乙個物件傳遞給類的成員變數 singletonpattern,你要的時候 getinstance()直接返回給你,解決問題!

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...

單例模式 懶漢式單例模式

單例模式有餓漢時模式和懶漢式 單例模式也就是說同一類只返回乙個物件供外部類使用 懶漢式即延遲初始化單例。在多執行緒環境下,簡單的懶漢式會有執行緒安全。懶漢式單例模式解決線性安全問題如下 1 使用雙重檢查鎖機制解決執行緒安全問題。2 單例模式還有更好的解決方案,即使用靜態類方式。懶漢式單例模式典型 p...