單例模式,顧名思義就是只有乙個例項,並且她自己負責建立自己的物件,這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 屬於建立型模式。
懶漢式分為 執行緒安全 和 執行緒不安全兩種方式,區別在於是否新增了synchronized關鍵字。
懶漢式,因為比較懶,所以只有在呼叫的時候才會去判斷有沒有例項,如果已經例項則返回,反之則新建。
public
class
singleton
//靜態工廠方法
public
static singleton getinstance()
return instance;
}}
執行緒安全
優點:第一次呼叫才初始化,避免記憶體浪費。
缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。
public
class
singleton
//靜態工廠方法
public
static
synchronized singleton getinstance()
return instance;
}}
餓漢式,例項在初始化時就已經建立好了,不管是否用到,都先建立例項。
優點:沒有加鎖,執行效率會提高。
缺點:類載入時就初始化,浪費記憶體。
public
class
singleton
//靜態工廠方法
public
static singleton getinstance()
}
雙檢鎖,又叫雙重校驗鎖,綜合了懶漢式和餓漢式兩者的優缺點整合而成。
特點是在synchronized關鍵字內外都加了一層 if 條件判斷,這樣既保證了執行緒安全,又比直接上鎖提高了執行效率,還節省了記憶體空間。
public
class
singleton
public
static singleton getinstance()
}}return singleton;
}}
當乙個執行緒發出請求後,會先檢查instance是否為null,如果不是則直接返回其內容,這樣避免了進入synchronized塊所需要花費的資源。
靜態內部類的方式效果類似雙檢鎖,但實現更簡單。但這種方式只適用於靜態域的情況,雙檢鎖方式可在例項域需要延遲初始化時使用。
public
class
singleton
//內部類
private
static
class
singletonholder
//靜態工廠方法
public
static singleton getinstance()
}
這種實現方式還沒有被廣泛採用,但這是實現單例模式的最佳方法。它更簡潔,自動支援序列化機制,絕對防止多次例項化。
public
enum singleton
}
一般情況下,不建議使用懶漢式,建議使用餓漢式。
只有在要明確實現 lazy loading 效果時,才會使用靜態內部類。
如果涉及到反序列化建立物件時,可以嘗試使用列舉式。
如果有其他特殊的需求,可以考慮使用雙檢鎖。
單例模式 單例模式
餓漢式 急切例項化 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...
每日一記 設計模式 單例模式
先從最常見的單例模式開始寫起 簡潔而且執行緒安全,但是缺點是即使不呼叫getinstance 方法ins也會被初始化,造成一定的資源浪費 public class singleton public static singleton getinstance 為了避免餓漢式的浪費,可按照如下實現 pub...