所謂類的單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項。並且該類只提供乙個取得其物件例項的方法(靜態方法)舉個最常見的例子,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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...