單例模式,顧名思義就是只有乙個例項,並且她自己負責建立自己的物件,這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。
1.餓漢式
單例例項被立即載入
天生就是執行緒安全的,可以直接用於多執行緒而不會出現問題;
由於乙個類在整個生命週期中只會被載入一次,因此該單例類只會建立乙個例項,也就是說,執行緒每次都只能也必定只可以拿到這個唯一的物件。因此就說,餓漢式單例天生就是執行緒安全的。
public
class
singleton1
public singleton1 getsingleton1()
}
2. 懶漢式
懶漢式: 單例例項被延遲載入
非執行緒安全: 會有多個執行緒同時進入 if (singleton2 == null) 語句塊的情形發生。
public
class
singleton2
public singleton2 getsingleton2()
return singleton2;
}}
3.懶漢式 同步延遲載入
synchronized方法
保證了對臨界資源的同步互斥訪問,也就保證了單例。
但是這種實現方式的執行效率會很低,因為同步塊的作用域有點大,而且鎖的粒度有點粗。
public
class
singleton3
// 使用 synchronized 修飾,臨界資源的同步互斥訪問
private
synchronized singleton3 getsingleton3()
return singleton3;
}}
synchronized**塊
public
class
singleton4
public singleton4 getsingleton4()
return singleton4;}}
}
4.懶漢式同步延遲載入 — 使用內部類實現延遲載入
私有內部類,按需載入,用時載入,也就是延遲載入
public
class
singleton5
private
singleton5()
public
static singleton5 getsingleton5()
}
5.懶漢式同步延遲載入 — 雙重校驗
為了在保證單例的前提下提高執行效率,我們需要對 singleton3 進行第二次檢查;
目的是避開過多的同步(因為這裡的同步只需在第一次建立例項時才同步,一旦建立成功,以後獲取例項時就不需要同步獲取鎖了)。
必須使用volatile關鍵字修飾單例引用。
public
class
singleton6
private
static singleton6 getsingleton6()
}}return singleton6;
}}
思考: 為啥是雙重校驗?第二次校驗的目的是啥
6.列舉類
利用列舉的特性,讓jvm來幫我們保證執行緒安全和單一例項的問題
public
enum singleton7
}
思考: 列舉類實現單例的原因?列舉內部實現? 設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會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...