設計模式 單例模式

2022-06-06 03:27:06 字數 2935 閱讀 3172

所謂類的單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項。並且該類只提供乙個取得其物件例項的方法(靜態方法)

舉個最常見的例子,spring中bean的預設都是單例模式,每個bean定義只生成乙個物件例項,每次getbean請求獲得的都是此例項

那接下來我們來聊聊單例模式的八種實現方式,如下所示

餓漢式(靜態常量)

餓漢式(靜態**塊)

懶漢式(執行緒不安全)

懶漢式(執行緒安全,同步方法)

懶漢式(執行緒安全,同步**塊)

雙重檢查

靜態內部類

列舉方式

//案例演示 - 餓漢式(靜態常量)

class singleton

//二、類的內部建立物件 final static

private static final singleton singleton = new singleton();

//三、對外提供公共的靜態方法,返回該類的唯一物件

public static singleton getinstance()

}

寫法分析

優勢:簡單、避免多執行緒的同步問題

劣勢:沒有達到懶載入的效果

class singleton()

//類的內部建立物件

private static final singleton singleton;

static

//對外提供公共的靜態方法

public static singleton getinstance()

}

寫法分析

優勢:簡單,避免了多執行緒同步問題

劣勢:沒有實現懶載入效果

class singleton()

//類的內部建立物件

private static singleton singleton;

//對外提供公共的靜態方法

public static singleton getinstance()

return singleton;

}}

寫法分析

優勢:起到了懶載入的效果,不會造成記憶體浪費

class singleton()

//類的內部建立物件

private static singleton singleton;

//對外提供公共的靜態方法

public static synchronized singleton getinstance()

return singleton;

}}

寫法分析

解決了執行緒安全問題,但是效率太低

class singleton()

//類的內部建立物件

private static singleton singleton;

//對外提供公共的靜態方法

public static singleton getinstance()

}return singleton;

}}

寫法分析

不推薦,解決不了執行緒安全的問題

class singleton()

//類的內部建立物件

private static singleton singleton;

//對外提供公共的靜態方法

public static singleton getinstance()}}

return singleton;

}}

寫法分析

在實際開發中推薦使用這種方式

執行緒安全

懶載入效率很高

可能出現的問題

我們認為的new singleton()操作

分配記憶體位址m

在記憶體m上初始化singleton物件

將m的位址值賦值給instance物件

jvm編譯優化後(指令重排)可能的new singleton()操作

分配記憶體位址m

將m的位址賦值給instance變數

在記憶體m上初始化singleton物件

會出現空指標異常

解決方法

只需要關鍵字volatile 禁止指令重排

private static volatile  singleton singleton;
輕量級的同步機制(低配版)沒***原子性

三大特性

保證可見性

其中乙個執行緒修改了主記憶體共享變數的值,要寫回主記憶體,並要及時通知其他執行緒可見

沒***原子性

(不能保證)不可以分割,完整,要麼同時成功,要麼同時失敗

禁止指令重排

和底層記憶體屏障相關,避免多執行緒下出現指令亂序的情況

class singleton

private static class singletoninstance

public static singleton getinstance()

}

寫法分析

不會出現執行緒安全問題

jvm來幫我們保證執行緒的安全性『

利用了靜態內部類的特點,效率也很高,開發中推薦

enum singleton
寫法分析

不僅可以避免執行緒安全問題,推薦大家使用

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...