定義:安全
單例模式:確保某一個類只有一個實例,並且自行實例化並向整個系統提供這個實例。多線程
使用場景:函數
確保某一個類有且只有一個對象的場景,避免產生多個對象消耗過多的資源,或者某種類型的對象只應該有且只有一個。線程
UML類圖:對象
單例模式幾個關鍵點:blog
一、構造函數不對外開放,通常爲private。內存
二、經過一個靜態方法或者枚舉返回單例類對象。資源
三、確保單例類的對象有且只有一個,尤爲在多線程環境下。get
四、確保單例類對象在反序列化時不會從新構建對象。同步
單例模式簡單代碼:
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
單例模式其餘方式:
一、懶漢模式:聲明一個靜態對象,而且在用戶第一次調用getInstance時進行初始化,在getInstance()方法中添加了synchronized關鍵字,實現該方法的同步管理,特別是在多線程狀況下,防止重複初始化。
該模式優勢:單例只有在使用時才被實例化,節省資源;缺點:第一次加載實例化,反應慢,最大問題是每次調用getInstance()方法都須要同步,形成沒必要要的同步開銷。
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
二、Double Check Lock(DCL雙重檢查鎖定)
DCL方式實現單例模式優勢是,既可以在須要時才初始化單例,又能保證線程安全,而且單例對象初始化後調用getInstance()方法不進行同步鎖。
該實現方式最大的優勢在於getInstance()方法上,針對於instance對象進行了兩次驗證是否爲NULL;這兩種判斷主要作了三件事情:
(1)給Singleton實例對象分配內存(2)調用Singleton的構造函數,初始化成員字段(3)將instance對象指向分配的內存空間;
實例代碼以下:
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
instance=new Singleton();
}
}
return instance;
}
}
三、靜態內部類單例模式
在Singleton類中聲明一個靜態內部類,靜態類裏實現單例對象的實例化,這樣既能夠確保線程安全,也可保證單例對象惟一性,同時延遲單例的實例化,這是比較推薦的一種方式。
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static Singleton getInstance(){
return SingletonTool.instance;
}
/****靜態內部類****/
private static class SingletonTool{
private static final Singleton instance=new Singleton();
}
}
單例模式優勢:減小內存開支,避免資源浪費,常住內存,實現全局數據管理和共享;
單例模式缺點:擴展難,若是在Android中持有Context,容易形成內存泄漏,最好使用Application Context;