設計模式—單例模式(轉)

xilinchen發表於2012-09-04

 看別人寫的設計模式 覺得很好。

 引用別人的 自己就不造輪子了。。。。。

 轉載  http://liuqing9382.iteye.com/blog/1441661

單例模式:
三個要點:
1.某個類只能有一個例項。
2.它必須自行建立這個例項;
3.它必須自行向外提供這個例項。

餓漢式:

 

public class Singleton{   
  
   private static Singleton singleton = new Singleton ();   
  
   private Singleton (){}   
  
   public Singleton getInstance(){   
  
     return singletion;   
  
   }   
  
}   

 優點:

    1.執行緒安全
    2.在類載入的同時已經建立好一個靜態物件,呼叫時反應速度快
缺點:
      資源效率不高,可能getInstance()永遠不會執行到,但執行該類的其他靜態方法或者載入了該類(class.forName),那麼這個例項仍然初始化 
    

懶漢式: (懶載入的思想,用到才會初始化例項)

public class Singleton{   
  
private static Singleton singleton = null;   
  
public static synchronized Singleton getInstance(){   
  
if(singleton==null){   
  
singleton = new Singleton();   
  
}   
  
return singleton;   
  
}   
  
}   

 優點:
資源利用率高,不執行getInstance()就不會被例項,可以執行該類的其他靜態方法
缺點:
    第一次載入時不夠快,多執行緒使用不必要的同步開銷大
比較:
餓漢式是執行緒安全的,在類建立的同時就已經建立好一個靜態的物件供系統使用,以後不再改變。
懶漢式如果在建立例項物件時不加上synchronized則會導致對物件的訪問不是執行緒安全的,
推薦使用第一種
  假設多執行緒訪問的時候,執行緒1在在new Instence() 系統分配記憶體需要0.01秒時間 ,但就這這個0.01秒 又有其他的執行緒訪問了,這時候就要再次instance 還是為null  又要再次new

  導致了執行緒不安全。

 

雙重檢測:

class Singleton4 {   
private Singleton4() {}   
    
public static Singleton4 instance = null;   
    
public static Singleton4 getInstance() {   
if (instance == null) {   
synchronized (Singleton4.class) {   
if (instance == null) {   
instance = new Singleton4();   
}   
            }   
}   
return instance;   
}   
}  

 

優點:
資源利用率高,不執行getInstance()就不被例項,可以執行該類其他靜態方法
缺點:
    第一次載入時反應不快,由於java記憶體模型一些原因偶爾失敗

 

靜態內部類:

 

class Singleton5 {   
private Singleton5() {}   
     private static class SingletonHelp {   
static Singleton5 instance = new Singleton5();   
}   
public static Singleton5 getInstance() {   
    return SingletonHelp.instance;   
}   
}  

 

優點:
    資源利用率高,不執行getInstance()不被例項,可以執行該類其他靜態方法
缺點:
    第一次載入時反應不夠快

 

 

 

 

 

 

 

 

 

 

 

 


相關文章