singleton模式的一種變體:double-checked locking (轉)
singleton模式的一種變體:double-checked locking (轉)[@more@]singleton的一種變體:double-checked locking
在單執行緒下,我們的singleton多半是這樣():
class Singleton{
private Singleton(){ //... };
private static Singleton instance = null;
public static Singleton getInstance
{
if ( instance == null )
instance = new Singleton();
return instance;
};
//...
}
但是在多執行緒環境下,這裡有個問題:如果一個執行緒先檢查了instance==null,然後開始建立新的例項;同時另一個執行緒又來檢查instance==null(此時第一個執行緒的建立還沒完成),然後也建立新的例項。這樣就有了Singleton類的兩個例項——我們的singleton模式失敗了。
所以我們應該加入同步程式碼。但是加在哪裡呢?如果每個執行緒都需要同步再獲得例項引用,這必然會形成一個瓶頸;如果在instance==null的檢查後面加同步程式碼……這根本沒有用。為什麼?自己想想吧。
我們應該怎麼辦?同步程式碼肯定應該在instance==null的後面,同時,在建立新之前應該再檢查一次instance==null:
class Singleton{
//...
private synchronized static void doSync(){
//在這裡同步
}
public Singleton getInstance(){
if(instance==null){
Singleton.doSync();
if(instance==null) // 再進行一次檢查
instance = new Singleton();
}
return instance;
}
兩次檢查,既避免了瓶頸,又避免了重複建立。這就是double-checked locking模式。
在單執行緒下,我們的singleton多半是這樣():
class Singleton{
private Singleton(){ //... };
private static Singleton instance = null;
public static Singleton getInstance
{
if ( instance == null )
instance = new Singleton();
return instance;
};
//...
}
但是在多執行緒環境下,這裡有個問題:如果一個執行緒先檢查了instance==null,然後開始建立新的例項;同時另一個執行緒又來檢查instance==null(此時第一個執行緒的建立還沒完成),然後也建立新的例項。這樣就有了Singleton類的兩個例項——我們的singleton模式失敗了。
所以我們應該加入同步程式碼。但是加在哪裡呢?如果每個執行緒都需要同步再獲得例項引用,這必然會形成一個瓶頸;如果在instance==null的檢查後面加同步程式碼……這根本沒有用。為什麼?自己想想吧。
我們應該怎麼辦?同步程式碼肯定應該在instance==null的後面,同時,在建立新之前應該再檢查一次instance==null:
class Singleton{
//...
private synchronized static void doSync(){
//在這裡同步
}
public Singleton getInstance(){
if(instance==null){
Singleton.doSync();
if(instance==null) // 再進行一次檢查
instance = new Singleton();
}
return instance;
}
兩次檢查,既避免了瓶頸,又避免了重複建立。這就是double-checked locking模式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1007851/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 兩種Delphi實現Singleton模式方法 (轉)模式
- Singleton——單例模式(8種)單例模式
- 設計模式 - 單例模式Singleton的8種寫法設計模式單例
- singleton模式的實現方法有很多種麼?模式
- C++設計模式:Singleton的模板實現之一 (轉)C++設計模式
- JScript下Singleton模式的實現。 (轉)JS模式
- Singleton模式之Delphi實現 (轉)模式
- Python單例模式(Singleton)的N種實現Python單例模式
- singleton模式四種執行緒安全的實現模式執行緒
- 設計模式、用Delphi實現---->Singleton 模式 (轉)設計模式
- C++完美實現Singleton模式[轉]C++模式
- JAVA中實現單例(Singleton)模式的八種方式Java單例模式
- OOAD之單例模式Singleton的6種寫法單例模式
- 關於singleton模式的一個問題?模式
- Java Q&A: 使用Singleton模式?給我一個理由先! (轉)Java模式
- Scala 與設計模式(一):Singleton 單例模式設計模式單例
- PHP設計模式(一)—單例模式(Singleton Pattern)PHP設計模式單例
- 關於多型實現Singleton模式的探討 (轉)多型模式
- 設計模式入門(1)------單件(Singleton) (轉)設計模式
- 怎麼使用EJB來達到singleton模式 (轉)模式
- C++用多種方式實現Singleton單例模式C++單例模式
- Singleton設計模式設計模式
- 單例模式 singleton單例模式
- 單例模式--SingleTon單例模式
- 單例模式(Singleton)單例模式
- 企業ERP軟體的“三種模式”(轉)模式
- 一天一個設計模式(二) - 單例模式(Singleton)設計模式單例
- 三種Singleton的實現方式
- 設計模式—singleton(單例模式)設計模式單例
- 設計模式 - 單例模式(Singleton)設計模式單例
- 改變固有思維的一種模式-關鍵路徑模式
- 單例模式(Singleton Pattern)單例模式
- 設計模式 - Singleton in Java設計模式Java
- 設計模式(四)Singleton設計模式設計模式
- java設計模式-單例模式SingletonJava設計模式單例
- 設計模式之單例模式 - Singleton設計模式單例
- 設計模式——3單例模式(Singleton)設計模式單例
- 設計模式之Singleton - 單態模式設計模式