這種模式涉及到乙個類,該類負責建立自己的物件,同時確保只有乙個物件被建立。
這種設計模式的實現有幾種方式:
懶漢模式
/**
* @description: 懶漢模式,執行緒不安全
*/public class singletondemo
// 單例物件
private static singletondemo instance = null;
// 靜態工廠方法
public static singletondemo getinstance()
return instance;
}}
進過改造,在工廠方法上加synchronized, 會變成執行緒安全。但是synchronized會導致效能下降。
/**
* @description: 懶漢模式,安全
*/public class singletondemo
// 單例物件
private static singletondemo instance = null;
// 靜態工廠方法
public static synchronized singletondemo getinstance()
return instance;
}}
再次改造,由於指令重排,導致執行緒不安全。
/**
* @description: 懶漢模式(雙重檢測機制),執行緒不安全
*/public class singletondemo
// 單例物件
private static singletondemo instance = null;
/*** 靜態工廠方法
* instance = new singletondemo(); 會執行三步操作
* 1、分配物件的記憶體空間
* 2、載入初始化物件
* 3、設定instance 指向剛分配的記憶體
* 在多執行緒情況下會發生指令重排,例如會導致執行順序變為 1、3、2
* 下面 a執行緒執行到第3步,指向了記憶體,b執行緒這時候判斷 instance不為空,就會直接返回
* 繼續使用b執行緒返回結果會導致出錯
* @return
*/public static singletondemo getinstance() }}
return instance;
}}
再次改造,使用volate修飾,保證不會發生執行緒重排。
/**
* @description: 懶漢模式,執行緒安全
*/public class singletondemo
// 單例物件
private volatile static singletondemo instance = null;
/*** 靜態工廠方法
* @return
*/public static singletondemo getinstance() }}
return instance;
}}
餓漢模式
/**
* @description: 餓漢模式,執行緒安全。單例例項在類裝載時進行建立。
* 初始化時候,如果有太多操作,會導致類載入很慢,可能會引起效能問題及如果不適用則造成資源浪費
*/public class singletondemo
// 單例物件
private static singletondemo instance = new singletondemo();
// 靜態工廠方法
public static singletondemo getinstance()
}
列舉模式
/**
* @description: 列舉模式,執行緒安全
*/public class singletondemo
/*** 靜態工廠方法
* @return
*/public static singletondemo getinstance()
private enum singleton
public singletondemo getinstance()
}}
設計模式 單例模式
單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...