1. 程式人生 > 其它 >單例模式中的懶漢模式和餓漢模式是什麼?區別又是什麼?

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

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)記憶體使用:餓漢式在一開始類載入的時候就例項化,無論使用與否,都會例項化,所以會佔據空間,浪費記憶體。懶漢式什麼時候用就什麼時候例項化,不浪費記憶體。