2、懶漢式
3、靜態內部類
4、註冊式
四、單例模式在實際中的運用
五、單例模式的使用場景
單例設計模式,簡單來說就是通過一定方法保證某個類在整個系統程式中僅存在乙個例項,且各類僅保證乙個區的其物件例項的方法。
1、餓漢式
(1)靜態常量
(2)靜態**塊
2、懶漢式
(1)原版
(2)雙重檢測版
(3)執行緒安全版
3、靜態內部類
4、註冊式
(1)列舉式
(2)容器式
//1.餓漢式(靜態變數)
class
singleton
//2.本類內部建立物件例項
private
final
static singleton instance =
newsingleton()
;//3.提供乙個公有的靜態方法返回例項物件
public
static singleton getinstance()
}
優缺點
(1)優點:該方法基於類裝載機制,避免了多執行緒同步的問題
(2)缺點:沒有達到懶載入的效果,即若從未使用該例項,則造成記憶體的浪費。
//2.餓漢式(靜態變數)
class
singleton
//2.本類內部建立物件例項
private
static singleton instance;
static
//3.提供乙個公有的靜態方法,返回例項物件
public
static singleton getinstance()
}
優缺點
(1)優點:該方法基於類裝載機制,避免了多執行緒同步的問題
(2)缺點:沒有達到懶載入的效果,即若從未使用該例項,則造成記憶體的浪費。
//3.懶漢式(原版)
class
singleton
//提供乙個靜態的公有方法(靜態工廠),只有呼叫方法時才去建立instance
//即懶載入 執行緒不安全
public
static singleton getinstance()
return instance;}}
...public
static
void
main
(string[
] args)
throws exception},
"lazylost");
a.start()
;// a.join();
thread b =
newthread((
)->},
"lazylost2");
b.start()
;}}
優缺點
(1)優點:該方法起到了懶載入的效果,即不會造成記憶體浪費
(2)缺點:多執行緒下,執行緒a進入到if(singleton == null)判斷語句後,執行緒b也通過該判斷語句,則產生了多個例項。
//4.懶漢式(雙重檢測)
class
singleton
//提供乙個靜態的公有方法(靜態工廠),只有呼叫方法時才去建立instance
//即懶載入 同步**塊
public
static singleton getinstance()
}}return instance;
}
優缺點
(1)優點:該方法起到了懶載入的效果,即不會造成記憶體浪費;雙重檢測機制保障一定程度上的執行緒安全;同步**塊而不是同步方法保證了程式效能。
(2)缺點:jvm編譯器的指令重排將有可能導致生成乙個未初始化的例項。
//5.懶漢式(執行緒安全)
class
singleton
//提供乙個靜態的公有方法(靜態工廠),只有呼叫方法時才去建立instance
//即懶載入 同步**塊
public
static singleton getinstance()
}}return instance;
}
優缺點
(1)優點:volatile關鍵字保證jvm的執行順序;懶載入,避免記憶體浪費;雙重檢測和同步塊保證執行緒安全。
(2)缺點:深轉殖會破壞該單例模式,解決方法請參考:深轉殖破壞單例模式
//6.靜態內部類
class
singleton
}private
static
class
singletoninstance
//static保證了單例的共享空間,final保證該方法不被重寫
public
static
final singleton getinstance()
}...
public
static
void
main
(string[
] args)
throws exception
優缺點
(1)優點:利用靜態內部類避免了執行緒不安全,同時實現了懶載入,效率高;在構造方法中的限制導致反射無法破壞該單例
【注】
若未在構造方法中丟擲異常,則反射機制將破解該單例
enum singletonenum
}public
static
void
main
(string[
] args)
throws exception
}
優缺點
(1)優點:利用enum語法糖,jvm會組織反射獲取列舉類的私有構造方法。
(2)缺點:沒有達到懶載入的效果,即若從未使用該例項,則造成記憶體的浪費。
class
singleton
private
static map
ioc =
newconcurrenthashmap
();public
static object getbean
(string classname)
catch
(exception e)
return obj;
}else}}
}
優缺點
(1)優點:便於管理
(2)缺點:非執行緒安全
public
abstract
class
abstractautowirecapablebeanfactory
extends
abstractbeanfactory
implements
autowirecapablebeanfactory..
.//容器式
private factorybean<
?>
getsingletonfactorybeanfortypecheck
(string beanname, rootbeandefinition mbd)if(
issingletoncurrentlyincreation
(beanname)
) object instance = null;
try}
finally
factorybean<
?> fb =
getfactorybean
(beanname, instance);if
(bw != null)
return fb;}}
...}
public1)需要頻繁進行建立和銷毀的物件class
runtime..
.}
2)建立常使用的重量級物件(耗時耗資源)
3)工具類物件
4)頻繁訪問資料庫或檔案的物件(session工廠)
設計模式 單例模式
單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...