免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
JAVA實現(xiàn)單例模式的四種方法和一些特點

一、餓漢式單例類

復制代碼 代碼如下:

public class Singleton 

    private Singleton(){ 

    } 

    private static Singleton instance = new Singleton(); 

    private static Singleton getInstance(){ 
        return instance; 
    } 

特點:餓漢式提前實例化,沒有懶漢式中多線程問題,但不管我們是不是調用getInstance()都會存在一個實例在內存中

二、內部類式單例類

復制代碼 代碼如下:

public class Singleton    
{       
        private Singleton(){    

    }    

    private class SingletonHoledr(){    
        private static Singleton instance = new Singleton();    
    }    

    private static Singleton getInstance(){    
        return SingletonHoledr.instance;    
    }    
}

特點:內部類式中,實現(xiàn)了延遲加載,只有我們調用了getInstance(),才會創(chuàng)建唯一的實例到內存中.并且也解決了懶漢式中多線程的問題.解決的方式是利用了Classloader的特性.

三、懶漢式單例類

復制代碼 代碼如下:

public class Singleton    
{       
    private Singleton(){    

    }    

    private static Singleton instance;    
    public static Singleton getInstance(){    
        if(instance == null){    
            return instance = new Singleton();    
        }else{    
            return instance;    
        }    
    }    
}  

特點:在懶漢式中,有線程A和B,當線程A運行到第8行時,跳到線程B,當B也運行到8行時,兩個線程的instance都為空,這樣就會生成兩個實例。解決的辦法是同步:

可以同步但是效率不高:

復制代碼 代碼如下:

public class Singleton    
{       
    private Singleton(){    

    }    

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

這樣寫程序不會出錯,因為整個getInstance是一個整體的"critical section",但就是效率很不好,因為我們的目的其實只是在第一個初始化instance的時候需要locking(加鎖),而后面取用instance的時候,根本不需要線程同步。

于是聰明的人們想出了下面的做法:

雙檢鎖寫法:

復制代碼 代碼如下:

public class Singleton{ 
  private static Singleton single;    //聲明靜態(tài)的單例對象的變量 
  private Singleton(){}    //私有構造方法  

  public static Singleton getSingle(){    //外部通過此方法可以獲取對象   
    if(single == null){    
        synchronized (Singleton.class) {   //保證了同一時間只能只能有一個對象訪問此同步塊       
            if(single == null){     
                single = new Singleton();         
        }    
      } 
    }   
    return single;   //返回創(chuàng)建好的對象  
  } 

思路很簡單,就是我們只需要同步(synchronize)初始化instance的那部分代碼從而使代碼既正確又很有效率。
這就是所謂的“雙檢鎖”機制(顧名思義)。
很可惜,這樣的寫法在很多平臺和優(yōu)化編譯器上是錯誤的。

原因在于:instance = new Singleton()這行代碼在不同編譯器上的行為是無法預知的。一個優(yōu)化編譯器可以合法地如下實現(xiàn)instance = new Singleton():

1. instance  = 給新的實體分配內存

2. 調用Singleton的構造函數(shù)來初始化instance的成員變量

現(xiàn)在想象一下有線程A和B在調用getInstance,線程A先進入,在執(zhí)行到步驟1的時候被踢出了cpu。然后線程B進入,B看到的是instance  已經(jīng)不是null了(內存已經(jīng)分配),于是它開始放心地使用instance,但這個是錯誤的,因為在這一時刻,instance的成員變量還都是缺省值,A還沒有來得及執(zhí)行步驟2來完成instance的初始化。

當然編譯器也可以這樣實現(xiàn):

1. temp = 分配內存

2. 調用temp的構造函數(shù)

3. instance = temp

如果編譯器的行為是這樣的話我們似乎就沒有問題了,但事實卻不是那么簡單,因為我們無法知道某個編譯器具體是怎么做的,因為在Java的memory model里對這個問題沒有定義。

雙檢鎖對于基礎類型(比如int)適用。很顯然吧,因為基礎類型沒有調用構造函數(shù)這一步。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
GoF設計模式之五 Singleton- -
怎樣實現(xiàn)線程安全的延遲初始化單例模式 ??
單例模式的七種寫法
算法55 Singleton(C/C++/C#)
單例模式的八種寫法比較
Java單例模式(Singleton)以及實現(xiàn)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服