單例模式

三個要素

1、私有的構(gòu)造方法
2、指向自身的靜態(tài)實例引用
3、公有的靜態(tài)的獲取自身實例方法

餓漢式


public class Singleton{
        private static Singleton singleton = new Singleton();
        private Singleton(){};
        public static Singleton getInstance(){
            return singleton;
        }
    }

懶漢式


public class Singleton{
        private static Singleton singleton;
        private Singleton(){};
        public static Singleton getInstance(){
            if(singleton==null){
                singleton = new Singleton();
            }
            return singleton;
        }
    }

但是以上方式在多線程環(huán)境下會出現(xiàn)問題,可能會new出來多個實例。
固需加鎖,但是直接在方法上加synchronized關(guān)鍵字,每次獲取實例都會加鎖,而事實上只需在創(chuàng)建實例的時候才需加鎖。故將getInstance方法改成如下:


public static Singleton getInstance() {
        if (singleton== null) {
            synchronized (singleton) {
                if (singleton== null) {
                    singleton= new Singleton();
                }
            }
        }
        return singleton;
    }

當(dāng)然也可以將創(chuàng)建實例的過程與獲取實例的過程分開。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容