單例模式的五種實現方式

單例模式能夠說是23中設計模式中應用最廣的一種模式了。  
java

      定義:確保某一個類只有一個實例,自行實例化而且想整個系統提供這個實例。設計模式

      使用場景:避免某個類產生多個對象而消耗過多的資源,確保某個類在程序中只有一個實例。好比咱們使用的圖片加載器ImageLoader。每每單例建立的對象,耗費的資源都比較多,因此在初始化單例對象的時候就顯得尤其重要了,接下來,咱們就來聊一聊單例的幾種實現方式。多線程

1、餓漢式ide

[java] view plain copy性能

  1. public class ImageLoader{  優化

  2.   

  3.      private static ImageLoader instance = new ImageLoader;  url

  4.      private ImageLoader(){}  spa

  5.      public static ImageLoader getInstance(){   .net

  6.        return instance;   線程

  7.   }  

  8. }  




餓漢式顧名思義,就是這個漢子很餓,一上來就把單例對象建立出來了,要用的時候直接返回便可,這種能夠說是單例模式中最簡單的一種實現方式。可是問題也比較明顯。單例在尚未使用到的時候,初始化就已經完成了。也就是說,若是程序從頭到位都沒用使用這個單例的話,單例的對象仍是會建立。這就形成了沒必要要的資源浪費。因此不推薦這種實現方式。


2、懶漢式


[java] view plain copy

  1. public class ImageLoader{  

  2.      private static ImageLoader instance;  

  3.      private ImageLoader(){}  

  4.      public static synchronized ImageLoader getInstance(){   

  5.             if(instance == null){   

  6.                  instance = new ImageLoader();   

  7.            }   

  8.             return instance;  

  9.       }  

  10. }  



餓漢式也顧名思義,就是這個漢子比較懶,一開始的時候什麼也不作,知道要使用的時候採起建立實例的對象。看起來還不錯,只有在使用實例的時候,咱們纔回去建立對象。可是細心的同窗可能發現了,咱們在獲取實例的方法上加了鎖,避免多線程引起的建立多個單例的狀況。多線程的問題是避免了,但也形成了總體性能的降低,每次使用單例對象,都須要鎖判斷,下降了總體性能。很明顯,懶漢式也不是咱們所要追求的目標。


3、Double CheckLock實現單例

英文稍好點的東西,應該都看懂了,DCL也就是雙重鎖判斷機制,直接上代碼。


[java] view plain copy

  1. public class ImageLoader{  

  2.      private static ImageLoader instance;  

  3.      private ImageLoader(){}  

  4.      public static ImageLoader getInstance(){  

  5.            if(instance == null){  

  6.                    synchronized (ImageLoader.class){  

  7.                         if(instance == null){  

  8.                            instance = new ImageLoader();  

  9.                            }  

  10.                     }  

  11.              }   

  12.              return instance;   

  13.         }  

  14. }  



能夠看到,在獲取單例對象的時候,咱們先進行了兩爲空判斷,而且在第二次判斷前加了鎖,這就讓程序變得更加優秀,在使用的時候,只會前幾回獲取單例對象的時候會進行鎖判斷,一旦單例對象建立完成,鎖的任務也就完成了,在懶漢式的基礎上,提升了性能。DCL是使用最多的單例實現方式,可以在使用的時候才進行單例對象的初始化建立,而且可以在絕大多數狀況下保證對象的惟一性的正確性。請注意,是絕大多數狀況下,也就是說,這種模式也不能徹底保證單例的對象的完美實現,可是,就通常狀況下,這種模式都能知足需求。俗話說,學無止境,接下來咱們就來看看單例模式的終極實現版本。


4、靜態內部類實現模式

直接上代碼


[java] view plain copy

  1. public class ImageLoader{  

  2.     private static class InnerInstance{  

  3.        private static final ImageLoader instance = new ImageLoader();  

  4.     }  

  5.     private ImageLoader(){}  

  6.     public static ImageLoader ImageLoader(){  

  7.         return InnerInstance.instance;  

  8.    }  

  9. }  



能夠發現這種方式,並未加鎖,由於第一次加載ImageLoader類時,並不會實例化單例對象,只有第一次調用getInstance()方法時會致使虛擬機加載InnerInstance類,這種
方式不只能保證對象的單一性,還避免加鎖帶來的性能問題,又啓動了延遲加載的優化,因此這就是單例模式的終極實現版本,也是推薦使用的方式。

相關文章
相關標籤/搜索