天天看點

設計模式一(單例模式)

今天我們來探讨一下設計模式的建立型模式的第一個:單例模式

單例模式應用面特别的廣泛,因為它的設計模式就是整個項目環境中隻能存在一個靜态對象執行個體,這就會使資源的複用性增強,避免了在項目中有些高頻使用的對象頻繁的建立和銷毀,降低了系統的性能!

單例模式分為餓漢式的單例模式和懶漢式的單例模式!這兩種都有各的好處,沒有什麼絕對的誰就一定更勝一籌的說法。

餓漢式單例模式

public class HungryMan {

    private static HungryMan hungryMan=new HungryMan();    

public static HungryMan getInstance(){

            return hungryMan;    

}

以上是建立了一個餓漢的類,裡面就定義了一個靜态的對象執行個體,并建立了一個靜态方法讓外界能夠拿到此對象又不會暴露一些細節。這個線程是絕對安全的,因為這個是靜态執行個體對象随着類的加載而加載,而JVM底層的初始化加載是線程安全的。

public static void main(String[] args) {

            HungryMan instance1 = HungryMan.getInstance();    

HungryMan instance2 = HungryMan.getInstance();    

System.out.println(instance1 == instance2); //此答案為true

此時我們寫一個主線程運作一下,成功通過餓漢類的靜态方法拿到這個對象,為了證明從頭到尾我們始終用的是同一個對象,我在取了兩次對比,發現兩者對象的位址值是相同的,由此可以說明就是同一個對象!像這種寫法在各種架構底層或jdk底層都大量使用的,隻要深入源碼解析自然可以看到。(後期我也會寫一些源碼剖析的文章和大家一起讨論)

懶漢式單例模式

public class LazyMan {

    private volatile static LazyMan lazyMan;

   public static LazyMan getInstance(){

        if (lazyMan==null){

            synchronized (LazyMan.class){

                if (lazyMan==null){

                    return lazyMan=new LazyMan();                

            }

        }

        return lazyMan;    

上面就是懶漢式的一種正常寫法,懶漢式與餓漢式不同的是,一個一開始就建立好另一個有需求了再建立。是以初始化時是一個空對象,這裡用到了synchronize同步鎖機制 是因為這個對象并不是類初始化時建立的,而是在有需求調用時才建立的,有可能會引發多線程調用同一個方法,破壞對象的單例設計模式,是以必須上鎖!當第一個線程進入建立了對象後,後面的線程便不會再進行同步操作,而是直接傳回對象了,不會因為同步而降低效率,這也凸顯出設計模式的強大之處!

   LazyMan instance3 = LazyMan.getInstance();

   LazyMan instance4 = LazyMan.getInstance();

   System.out.println(instance3 == instance4); //true

最後同樣多次調用方法取出對象,判斷引用位址是否相同,結果也是顯而易見的為true,就是懶漢式的單例模式。

最後總結:餓漢、懶漢各有好處,餓漢式在類加載變初始化成功,産生對象随時都可調用。懶漢式的按需加載,既可以節約記憶體空間,需要時又可以即時調用。具體要用哪種模式,要看業務需求适合哪種模式。真實世界上沒有一個事物或人是完美無瑕的,隻有适合自己的才是最好的。正如這篇文章一樣如果你覺得還行,其中的内容也适合自己或身邊朋友,可以評論或轉發,這是給筆者莫大的鼓勵哦!