單例模式 Singleton Pattern

2021-08-08 14:47:21 字數 2852 閱讀 1255

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點

當系統需要某個類只能有乙個例項時適用

大致有六種寫法,每一種寫法各有特點:懶漢 – 執行緒不安全這種寫法可以實現lazy-loading, 但是多個執行緒可能會同時申請例項,無法保證安全。

懶漢 – 執行緒安全

在1的基礎上增加乙個同步鎖synchronized, 以保證執行緒安全;

但是效率不高,因為事實上只需要在第一次例項化的時候需要同步鎖,以後就不可能再例項化了。

懶漢 – 執行緒安全 – 雙檢鎖(dcl)

雙檢鎖的奇妙之處在於,只在第一次例項化的時候才會進入第一層鎖,以後就不可能進入第一次鎖了;

這樣多個執行緒進入第二層鎖也只會在第一次。這就解決了第2種寫法效率低下的問題。

懶漢 – 執行緒安全 – 靜態內部類

這種方式能達到雙檢鎖同樣的效果,但是只在靜態域延遲初始化的情況下才適用。

餓漢 – 執行緒安全

執行緒安全,但是不能實現lazy-loading。

餓漢 – 執行緒安全 – 列舉

最簡潔的一種實現方法,不過其中的奧妙全自動需要追溯到列舉的實現上,感興趣的讀者可查閱其他資料,這裡不作贅述。

自動支援序列化,但是不能實現lazy-loading。

懶漢 – 執行緒不安全

public

class

singleton

public

static singleton getinstance()

}

懶漢 – 執行緒安全
public

class

singleton

public

static

synchronized singleton getinstance()

}

懶漢 – 執行緒安全 – 雙檢鎖(dcl)
public

class

singleton

public

static singleton getinstance()

}return instance;}}

懶漢 – 執行緒安全 – 靜態內部類
public

class

singleton

private

singleton() {}

public

static

final singleton getinstance()

}

餓漢 – 執行緒安全
public

class

singleton

public

static singleton getinstance()

}

餓漢 – 執行緒安全 – 列舉
public

enum singleton

}

懶漢 – 執行緒不安全
class singleton 

public

static singleton getinstance()

}

懶漢 – 執行緒安全
class singleton 

public

static singleton getinstance() }}

懶漢 – 執行緒安全 – 雙檢鎖(dcl)
class singleton 

public

static singleton getinstance()

}return instance;}}

懶漢 – 執行緒安全 – 靜態內部類餓漢 – 執行緒安全餓漢 – 執行緒安全 – 列舉懶漢 – 執行緒不安全懶漢 – 執行緒安全懶漢 – 執行緒安全 – 雙檢鎖(dcl)

懶漢 – 執行緒安全 – 靜態內部類

餓漢 – 執行緒安全

餓漢 – 執行緒安全 – 列舉

不推薦使用 1 和 2在不要求lazy-loading的情況下,推薦 5 (3 也可)在要求lazy-loading的情況下,推薦 4 (3 也可)涉及反序列化建立對像時,推薦 63 的價效比最高,萬金油

單例模式 單例模式

餓漢式 急切例項化 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...