懶漢式與餓漢式的區別


java設計模式單例模式  ----懶漢式與餓漢式的區別

常用的五種單例模式實現方式

——主要:

  1.餓漢式(線程安全,調用率高,但是,不能延遲加載。)

  2.懶漢式(線程安全,調用效率不高,可以延時加載。)

——其他:

  1.雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題,不建議使用)

  2.靜態內部類式(線程安全,調用效率高。但是,可以延時加載)

  3.枚舉式(線程安全,調用率高,不能延時加載)

如何選用?

  ——單例對象 占用資源少,不需要 延時加載

    枚舉式 好於 餓漢式

  ——單例對象 占用資源大,需要延時加載

    靜態內部類式 好於 懶漢式

 

 

下面介紹一下 java設計模式單例模式中懶漢式與餓漢式的區別





 

餓漢式:
        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)、其實也可以不用同步、看你的需求了,多創建一兩個無引用的廢對象其實也沒什么大不了。


免責聲明!

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



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