單例模式的正確使用姿勢

最原始的單例:

class HotelBusProcessor{
    private static HotelBusProcessor instance = null;

    private HotelBusProcessor(){
    }

    public static HotelBusProcessor getInstance(){
        if(instance==null) instance = new HotelBusProcessor();//這裏在多線程的時候可能會出現前一線程正在初始化,後一線程仍然判斷爲null的狀況
        return instance;
    }
}

正確寫法
寫法一:

class HotelBusProcessor{
    private static HotelBusProcessor instance = new HotelBusProcessor();
    private HotelBusProcessor(){
    }

    public static HotelBusProcessor getInstance(){
        return instance;
    }
}

此種單例模式可以有效保證只初始化一次,但是每次加載類的時候都會初始化,雖然解決了多線程問題,但對內存有不必要的消耗。
寫法二:

class HotelBusProcessor{
    private HotelBusProcessor(){
    }

    private static class singleInstanceHolder{
        private static HotelBusProcessor instance = new HotelBusProcessor();
    }

    public static HotelBusProcessor getInstance(){
        return  singleInstanceHolder.instance;
    }
}

此種單例模式可以有效保證只初始化一次,且每次加載類的時候不會初始化,既解決了多線程問題,同事對內存沒有不必要的消耗。
寫法三:

class HotelBusProcessor{
    private static HotelBusProcessor instance = null;

    private HotelBusProcessor(){
    }

    public static HotelBusProcessor getInstance(){
        if(instance==null){
            synchronized(HotelBusProcessor.class){//整個類鎖住
                //這裏在多線程的時候可能會出現前一線程正在初始化,後一線程仍然判斷爲null的狀況
                if(instance==null) instance = new HotelBusProcessor();
            }
        }
        return instance;
    }
}

此種單例模式可以有效保證只初始化一次,且每次加載類的時候不會初始化,既解決了多線程問題,同事對內存沒有不必要的消耗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章