單例模式,今天你用了嘛

連載文章

1.前言

提起設計模式,可能你們有些人會感受陌生,有些人會以爲常用。其實說到設計模式,不用感到陌生與懼怕,其實咱們天天在不經意間都在或多或少的使用或者接觸設計模式。這篇文章就是想帶你們瞭解最基礎的設計模式,單例模式!git

2.簡介

單例模式是指,有且只有一個該類的實例化對象,而且實例化過程由這個類本身實現。該類的構造函數是私有化的。github

3.常見的幾種單例模式

餓漢式單例模式

/**
 * 做者:jtl
 * 日期:Created in 2019/1/25 15:48
 * 描述:餓漢式單例模式
 * 優勢:1.空間換時間,每次都直接加載,節約了建立實例的時間
 * 缺點:1.由於不論是否用到了該類,都會直接建立實例,因此在不使用的狀況下,就浪費了空間
 */

public class HungrySingleton {
    private static HungrySingleton sSingleton = new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton getInstance(){
        return sSingleton;
    }
}
複製代碼

懶漢式單例模式

/**
 * 做者:jtl
 * 日期:Created in 2019/1/25 15:45
 * 描述:懶漢式單例模式
 * 優勢:1.時間換空間,在調用的時候才建立實例,節約了空間
 *      2.每次getInstance的時候才建立實例,節約了資源
 *
 * 缺點:1.每次在調用的時候才建立實例,有點浪費時間
 *      2.每次調用getInstance都須要線程同步,形成沒必要要的開銷
 */

public class LazySingleton {
    private static LazySingleton sSingleton;

    private LazySingleton(){}

    public static synchronized LazySingleton getInstance(){
        if (sSingleton==null){
            sSingleton=new LazySingleton();
        }

        return sSingleton;
    }
}
複製代碼

DCL(Double Check Lock)單例模式

/**
 * 做者:jtl
 * 日期:Created in 2019/1/25 16:16
 * 描述:DCL(Double Check Lock)單例模式
 * 優勢:1.在懶漢式的基礎上進行了判斷,只有在第一次建立實例的時候纔會,進行線程同步操做。資源利用率高
 * 缺點:1.高併發狀況下會出現問題
 *      2.JDK5以前會出現問題。因爲Java編譯器容許處理器亂序執行,JDK以前JMM中Cache寄存器到主內存回寫順序的規定,可能1-2-3,也可能1-3-2,因此可能JDK1.5以前出現問題
 *      (1)給DclSingleton分配內存
 *      (2)調用DclSingleton()的構造函數,初始化成員字段;
 *      (3)將mSingleton指向分配的內存空間(此時mSingleton不爲null)
 *      3.在JDK5以後,Java使用了新的內存模型JSR-133,它加強了volatile的內存語義。使用volatile修飾的對象,不會出現(2)中出現的問題
 */

public class DclSingleton {
    private static volatile DclSingleton mSingleton=null;
    private DclSingleton(){}

    public static DclSingleton getInstance(){
        if (mSingleton==null){
            synchronized (DclSingleton.class){
                if (mSingleton==null){
                    mSingleton=new DclSingleton();
                }
            }
        }

        return mSingleton;
    }
}
複製代碼

靜態內部類單例模式

/**
 * 做者:jtl
 * 日期:Created in 2019/1/25 16:14
 * 描述:靜態內部類單例模式
 * 優勢:1.保證了線程安全問題,也能保證單例的惟一性(推薦)
 * 缺點:
 */

public class StaticSingleton {
    private StaticSingleton(){}

    private static StaticSingleton getInstance(){
        return StaticSingletonHolder.sSingleton;
    }

    private static class StaticSingletonHolder{
        private static final StaticSingleton sSingleton=new StaticSingleton();
    }
}
複製代碼

4.後續

上面例舉了幾種常見的單例模式,其中本人最爲經常使用的是靜態內部類單例模式。固然這四種並非全部的單例模式,還有枚舉單例模式,以及使用Map容器實現的單例模式。若是是想直接找一個單例模式使用的話,那就直接複製代碼就好。若是想知道他們的優缺點的話,就能夠看下注釋。仍是那句話風裏雨裏在這裏等你,您的一個贊或者收藏就是我寫下去的動力,但願你們共同進步。若有錯誤請及時提出我也好改正。 另附GitHub源碼地址:github.com/13046434521…設計模式

相關文章
相關標籤/搜索