單例(Singleton)模式 也叫單態模式
我在另一篇文章中已經介紹過了過關於單例模式的簡單描述和優缺點,感興趣的朋友可以點擊下面的連接,在這裏我就不在贅述。
單例模式(Singleton)應用場景和優缺點
本篇文章主要介紹單例模式常見的5種實現方式,分別是:懶漢式、餓漢式、雙重檢測鎖式、靜態內部類式和枚舉單例。下面我將爲大家逐個介紹他們的特點和實現方式。
餓漢式(線程安全、調用效率高、不能延時加載)
package com.ph.gof23.singleton;
/**
* 測試餓漢式單例模式
* 特點:線程安全、調用效率高、不能延時加載
* 缺點:如果當該類加載很費時間且從未被調用時會造成資源的浪費
* @author PangHao
* @param instance 類初始化時立即加載的對象
*
*/
public class SingletonDemo01 {
//static變量會在類加載時初始化,此時不會出現多個線程訪問該對象的問題,虛擬機只加載一次該類(天然線程安全)
public static /*final*/ SingletonDemo01 instance=new SingletonDemo01(); //類初始化時立即加載該對象
//方法沒有同步調用效率高
public static SingletonDemo01 getInstance(){
return instance;
}
//私有構造器
private SingletonDemo01() {
// TODO Auto-generated constructor stub
}
}
懶漢式(線程安全、調用效率不高、可以延時加載)
package com.ph.gof23.singleton;
/**
* 測試懶漢式單例模式
* 特點:線程安全、調用效率不高、可以延時加載
* 缺點:如果該類加載很費時間當初次調用時加載速度慢,且由於訪問方法加鎖,所以當多個線程訪問時需要等待
* @author PangHao
* @param instance 單例對象
*
*/
public class SingletonDemo2 {
public static SingletonDemo2 instance; //聲明但不創建
//加鎖保證線程安全(調用效率不高)
public static synchronized SingletonDemo2 getInstance(){
if(instance==null){
instance=new SingletonDemo2();//在用的時候創建
}
return instance;
}
//私有構造器
private SingletonDemo2() {
// TODO Auto-generated constructor stub
}
}
*靜態內部類式(線程安全、調用效率高、可以延時加載)
package com.ph.gof23.singleton;
/**
* 測試靜態內部類式單例模式
* 特點:線程安全、調用效率高、可以延時加載
* 優點:綜合了懶漢餓漢的優點
* @author PangHao
* @param instance 單例對象
*
*/
public class SingletonDemo4 {
//靜態內部類(類加載時靜態內部類並不會立即初始化實現延時加載)
private static class SingletonClassInstance{
//線程安全
private static final SingletonDemo4 instance=new SingletonDemo4();
}
public static SingletonDemo4 getInstance(){
return SingletonClassInstance.instance;
}
//私有構造器
private SingletonDemo4() {
// TODO Auto-generated constructor stub
}
}
枚舉單例式(線程安全、調用效率高、不能延時加載)
package com.ph.gof23.singleton;
/**
* 測試枚舉式單例模式
* 特點:實現簡單,枚舉本身單例,避免反射、反序列化漏洞
* 缺點:不能延時加載
* @author PangHao
* @param INSTANCE 單例對象
* 該類爲枚舉類
*/
public enum SingletonDemo5 {
//創建一個枚舉元素,代表一個單例實例
INSTANCE;
//功能方法
public void SingletonOperation(){
//operation
}
}
雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題,不建議使用)
package com.ph.gof23.singleton;
/**
* 測試雙重檢測鎖式單例模式
* 特點:不必每次獲取對象時都進行同步
* 缺點:由於JVM底層內部模型原因,偶爾會出問題,不建議使用
* @author PangHao
* @param instance 單例對象
*
*/
public class SingletonDemo3 {
public static SingletonDemo3 instance=null;
public static SingletonDemo3 getInstance(){
if(instance==null){
SingletonDemo3 sc;
synchronized (SingletonDemo3.class) {
sc=instance;
if(sc==null){
synchronized (SingletonDemo3.class) {
if(sc==null){
sc=new SingletonDemo3();
}
}
instance=sc;
}
}
}
return instance;
}
//私有構造器
private SingletonDemo3() {
// TODO Auto-generated constructor stub
}
}