設計模式之 單例模式

2021-08-09 04:45:30 字數 2276 閱讀 4137

乙個類僅有乙個例項,並且自行例項化,向整個系統提供。

關鍵點:

單例實現從以下幾個方面來對比

是否能夠在使用時載入?

執行緒是否安全?

是否易用、易理解?

類載入時建立自身例項,執行緒安全。

/**

* 餓漢式

* 1. 不能在使用時才載入:如果該單例較耗資源,那麼效能問題會比較突出

* 2. 執行緒安全

* 3. 易用、易理解

* created by administrator on 2017/10/10.

*/public class singleinstance

// 簡單工廠模式

public static singleinstance getinstance()

}

在需要使用時才去建立自身例項,屬於懶載入,但是執行緒不安全。

/**

* 懶漢式

* 1. 懶載入

* 2. 執行緒不安全,不能用在多執行緒中

* 3. 易用、易理解

* created by administrator on 2017/10/10.

*/public class singleinstance

public static singleinstance getinstance()

return instance;

}}

2.2.1 懶漢式高階(synchronized)
在方法上加同步鎖

/**

* synchronized高階

* 1. 懶載入

* 2. 執行緒安全,但是效能較低

* 3. 易用、易理解

*/public synchronized static singleinstance getinstance()

return instance;

}

2.2.2 懶漢式高階(dclsingleinstance:雙重檢查鎖定)
在懶漢式的基礎上

去掉方法上的同步鎖synchronized在非空判斷中加同步鎖,保證效能

在同步**中再進行非空判斷,進行第二重檢查保證不會建立出第二個物件。

給instance加上volatile修飾符(高併發時使用需要):volatile關鍵字能禁止指令重排序,比如執行緒1建立了例項,intance被修改時會被強制寫到主存,其他執行緒也能實時獲取到該值。請參考:volatile參考

/**

* dcl懶載入

* 1. 懶載入

* 2. 執行緒安全,效能較高

* 3. 易用、易理解

* created by administrator on 2017/10/10.

*/public class singleinstance

public static singleinstance getinstance()}}

return instance;

}}

2.2.3 懶漢式高階(靜態內部類)
私有構造方法

在靜態內部類中宣告乙個靜態變數,並建立單例物件

在提供單例的靜態方法中呼叫返回靜態內部類中建立的單例物件

/**

* 靜態內部類

* 1. 懶載入

* 2. 執行緒安全,效能好

* 3. 易用、易理解

* created by administrator on 2017/10/10.

*/public class singleinstance

private static class singleinner

// 在呼叫該方法時,才會初始化instance

public static singleinstance getinstance()

}

判斷執行緒是否安全:有沒有可能建立多個instance?

假如單例需要占用的記憶體較多,那麼要優先使用可以懶載入的懶漢式單例。

單例還有列舉方式,由於用的較少,此處不再贅述。

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...