JAVA設計模式:單例(Singleton) – JAVA編程語言程序開發技術文章

  單例(Singleton)設計模式保證每個類隻有一個實例,並為這個實例提供一個全局的訪問點。

      與工具類中靜態成員不同,單例類一般用來保存應用程序的狀態數據,這些數據在應用程序的各個部分都可能被訪問或修改。

      單例模式的幾種實現方式。

[java]
public class Singleton{ 
    private static Singleton instance = new Singleton(); 
 
    public static Singleton getInstance() { 
        return instance; 
    } 
 
   /** Don't let anyone else instantiate this class */ 
   private Singleton() { 
   } 

      這種方式實現簡單,並且保證實例的唯一性,缺點是必須先加載後使用,而且不管單例類是否真正使用到,實例總是會先被加載,這看起來相當的不妥,因而有瞭懶加載(Lazy Initialization)的模式。

[java]
public class Singleton { 
    private static Singleton instance = null; 
 
    private Singleton() { 
 
    } 
 
    public static Singleton getInstance() { 
        if (instance == null) { 
            instance = new Singleton(); 
        } 
        return instance; 
    } 

      這種方式可以實現懶加載,但當多個線程同時進入getInstance方法時,可能會產生多份實例,這顯然違背單例模式的初衷。為瞭避免這種情況,考慮加上同步(synchronized)機制。
[java] 
public class Singleton { 
    private static Singleton instance = null; 
 
    private Singleton(){ 
    } 
 
    synchronized static public Singleton getInstance() { 
        if (instance == null) { 
            instance = new Singleton(); 
        } 
        return instance; 
    } 

     這種方式可以在懶加載的同時保證隻有一份實例,但對整個getInstance方法作同步處理會帶來線程同步上的性能消耗。www.aiwalls.com
[java]
public class Singleton { 
    private static Singleton instance; 
 
    private Singleton(){ 
    } 
 
    public static Singleton getInstance() { 
        if (instance == null){ 
            synchronized(Singleton.class){ 
                if(instance == null) { 
                     instance = new Singleton(); 
                } 
            } 
        } 
        return instance; 
    } 

     上面的方式就是所謂的Double-check Locking即雙重檢查和鎖定模式,目前看來很完美。
 作者:fancy888

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *