單例模式中的懶漢模式和餓漢模式是什么?區別又是什么?


1.懶漢模式:顧名思義,他是一個懶漢,他不願意動彈。什么時候需要吃飯了,他就什么時候開始想辦法搞點食物。

即懶漢式一開始不會實例化,什么時候用就什么時候new,才進行實例化。

2.餓漢模式:顧名思義,他是一個餓漢,他很勤快就怕自己餓着。他總是先把食物准備好,什么時候需要吃了,他隨時拿來吃,不需要臨時去搞食物。

即餓漢式在一開始類加載的時候就已經實例化,並且創建單例對象,以后只管用即可。

3.懶漢式代碼實現:

public class Singleton {
 //默認不會實例化,什么時候用就什么時候new
    private static Singleton instance = null;
    private Singleton(){

    }
    public static synchronized Singleton getInstance(){
        if(instance == null){
   //什么時候用就什么時候new
            instance = new Singleton();
        }
        return instance;
    }
}

4.餓漢式代碼實現:

public class Singleton {
 //一開始類加載的時候就實例化,創建單實例對象
    private static Singleton instance = new Singleton();
    private Singleton(){

    }
    public static Singleton getInstance(){
        return instance;
    }
}

5.懶漢式和餓漢式的安全和性能區別:

(1) 線程安全:餓漢式在線程還沒出現之前就已經實例化了,所以餓漢式一定是線程安全的。懶漢式加載是在使用時才會去new 實例的,那么你去new的時候是一個動態的過程,是放到方法中實現的,比如:   

public static synchronized Singleton getInstance(){
          if(instance == null){
     //什么時候用就什么時候new
              instance = new Singleton();
          }

如果這個時候有多個線程訪問這個實例,這個時候實例還不存在,還在new,就會進入到方法中,有多少線程就會new出多少個實例。一個方法只能return一個實例,那最終return出哪個呢?是不是會覆蓋很多new的實例?這種情況當然也可以解決,那就是加同步鎖,避免這種情況發生 。

(2)執行效率:餓漢式沒有加任何的鎖,因此執行效率比較高。懶漢式一般使用都會加同步鎖,效率比餓漢式差。
(3)內存使用:餓漢式在一開始類加載的時候就實例化,無論使用與否,都會實例化,所以會占據空間,浪費內存。懶漢式什么時候用就什么時候實例化,不浪費內存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM