1. 程式人生 > >單例模式中,餓漢式和懶漢式有什麼區別?各適合用在哪裡?為什麼說推薦用餓漢模式?

單例模式中,餓漢式和懶漢式有什麼區別?各適合用在哪裡?為什麼說推薦用餓漢模式?

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

     懶漢式:
       public class Singleton{
            private static Singleton singleton = null;

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

  比較:
         餓漢式是執行緒安全的,在類建立的同時就已經建立好一個靜態的物件供系統使用,以後不在改變
          懶漢式如果在建立例項物件時不加上synchronized則會導致對物件的訪問不是執行緒安全的

          推薦使用第一種 
從實現方式來講他們最大的區別就是懶漢式是延時載入,
他是在需要的時候才建立物件,而餓漢式在虛擬機器啟動的時候就會建立,
餓漢式無需關注多執行緒問題、寫法簡單明瞭、能用則用。但是它是載入類時建立例項(上面有個朋友寫錯了)、所以如果是一個工廠模式、快取了很多例項、那麼就得考慮效率問題,因為這個類一載入則把所有例項不管用不用一塊建立。
懶漢式的優點是延時載入、缺點是應該用同步(想改進的話現在還是不可能,比如double-check)、其實也可以不用同步、看你的需求了,多建立一兩個無引用的廢物件其實也沒什麼大不了。

相關推薦

模式懶漢式什麼區別適合哪裡?為什麼說推薦模式

 餓漢式:        public class Singleton{            private static Singleton singleton = new Singleton ();            private Singleton (){}            public

模式懶漢式哪些區別使用在哪裡?為什麼說推薦使用惡

餓漢式:        public class Singleton{            private static Singleton singleton = new Singleton ();            private Singleton (){}  

模式懶漢式區別

1、餓漢式是在單例類的例項在JVM啟動時就建立好了,懶漢式則是在第一次訪問單例類的例項時才去建立,即可以把餓漢式看成是預載入,懶漢式則為延遲載入; 示例程式碼: public class EagerSingleton { private static final Eag

JAVA設計模式懶漢式區別

定義:確保一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 型別:建立類模式 類圖: 類圖知識點: 1.類圖分為三部分,依次是類名、屬性、方法 2.以<<開頭和以>>結尾的為註釋資訊 3.修飾符+代表public,-代表p

Java設計模式懶漢式

set tin desc 驅動 ack 情況下 zed 獲取 java反射機制   Java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裏主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。  單例模式有以下特點:  1、單例類只能有一個實例。  2、單例類必須

Java——多執行緒基本使用(三) 懶漢式設計模式多執行緒之間的通訊

這一則部落格主要寫的是單例設計模式,與實現多執行緒之間的通訊等等~ 1.單例設計模式:保證類在記憶體中只有一個物件 2.保證類在記憶體中只有一個物件            &

Java模式懶漢式

單例模式顧名思義,就是隻能建立一個物件,這裡就限制了它的構造方法,不能隨便new了。所以用構造方法用private修飾。餓漢式和懶漢式通過名字也是可以區分的。餓漢式,餓了就主動去找食物了,就直接主動建立一個物件。然後通過公共的方法暴露給外部呼叫。懶漢式,懶了就用的時候再去建立

模式的實現(懶漢式

null cte get pri single singleton ins 安全 tin 1.懶漢模式。 class Singleton { private: static Singleton* m_instance; Singleton(

模式懶漢式

餓漢式:載入類的時候,就建立了物件 /** * 餓漢式:載入類的時候,就建立了物件 */ public class Ehanshi { // 建立物件 private static Ehanshi ehanshi = new Ehanshi(); // 無參

設計模式懶漢式

1.設計模式? 設計模式是在大量的實踐中總結和理論化之後優選的程式碼結構,程式設計風格,以及解決問題的思考方式。 2.單例模式的概念?     單例模式,我們首先必須將類在一個虛擬機器中只能產生一個物件,因此應該做到以下幾步:a:私有化構造方法,這樣在該類的外邊就不能用ne

模式懶漢式

常見的單例模式有兩種:餓漢式;懶漢式。 餓漢式程式碼如下: /** * 單例模式之餓漢式 * @author leon * @time 2018年4月27日 下午2:28:14 */ public class HungrySingleton {

設計模式模式 (關於懶漢式)

定義 單例模式是比較常見的一種設計模式,目的是保證一個類只能有一個例項,而且自行例項化並向整個系統提供這個例項,避免頻繁建立物件,節約記憶體。 單例模式的應用場景很多, 比如我們電腦的作業系統的回收站就是一個很好的單例模式應用,電腦上的檔案、視訊、音樂等被刪除後都會進入到回收站中;還有計算機中的印表機也是採用

懶漢式區別

從名字上來說,餓漢和懶漢, 餓漢就是類一旦載入,就把單例初始化完成,保證getInstance的時候,單例是已經存在的了, 而懶漢比較懶,只有當呼叫getInstance的時候,才回去初始化這個單例。 另外從以下兩點再區分以下這兩種方式: 1、執行緒安全: 餓

jsindexOf()、substring()substr()的區別

index length world mic 返回結果 document -s start star 1. indexOf() 返回指定的字符串在字符串首次出現的位置。 比如 var str="Hello world!" documen

在Pythonval、exec compile 什麼區別

基本上 eval 上用來評估一個動態生成的 Python 表示式;exec 額外的用於執行動態生成的 python 程式碼。 eval 和 exec 有以下兩個差異 eval 只接受一個表示式,exec 可以接受一個包含了 python 語句的程式碼塊: loops, try: except:, clas

java模式懶漢式區別

餓漢式: 設計思想:構造方法私有,這樣就保證了在外部是無法例項化物件的;然後先在內部定義一個靜態常量物件,再寫一個static方法來返回這個物件,這樣就保證是一個物件了。 【程式碼實現】 public class HungryManSingleton { /**

Java實現模式懶漢式、列舉帶測試。

Java實現單例的3種普遍的模式,餓漢式、懶漢式、列舉式。 具體程式碼如下: package com.lcx.mode; /** * * 餓漢式單例,不管以後用不用這個物件,我們一開始就建立這個物件的例項, * 需要的時候就返回已建立好的例項物件,所以比較飢餓,

JAVA模式及jdkRuntime類的模式實現方式詳解

一、描述 單例模式是一種非常常見的設計模式,即一個類只能有一個物件(例項),一般通過將該類的構造器私有化,來阻止在該類外建立該類的物件,並提供給外界一個唯一的物件(這個物件在該類中建立)。        java中的單例模式常見的有兩種實現方式,一種是惡漢方式,即將該類物件

java學習之模式懶漢式

分用 單例設計 單例 null 並發 auth 設計 pack 過多 ---恢復內容開始--- 設計模式:解決某一類問題最行之有效的方法 java中有23種設計模式 今天學習其中一種:單例設計模式:解決一個類在內存只存在一個對象 想要保證對象唯一。 1.為了避免其他程序

對象初始化過程與設計模式(懶漢式)

得到 延時 兩個 都是 person 其他 導致 最大 類屬性 1.對象初始化過程:(先加載類到內存,然後加載類屬性,成員方法)    定義一個類Person, 在new Person("zhangsan",20); 初始化過程: 因為new 用到Person.clas