21. 有些類也需計劃生育-----單例模式

大話設計模式

所有類都有構造方法穆碎,如果不編寫則系統(tǒng)默認生成空的構造方法丧荐,若有顯示定義的構造方法万栅,默認的構造方法就會失效未斑。
將構造方法寫成是private的,那么外部程序就不能用new來實例化它了。

單例模式: 保證一個類僅有一個實例溢豆,并提供一個訪問它的全局訪問點蜒简。

通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止你實例化多個對象漩仙。一個最好的辦法就是搓茬,讓類自身負責保存它的唯一實例。這個類可以保證沒有其他實例可以被創(chuàng)建队他,并且它可以提供一個訪問該實例的方法

單例模式因為類封裝它的唯一實例卷仑,這樣他可以嚴格的控制客戶怎樣訪問它以及何時訪問它。簡單地說就是對唯一實例的受控訪問漱挎。

多線程時的單例模式

1.懶漢模式

public class Singleton {

    private static Singleton singleton;

    private Singleton() {

    }

    public static Singleton getInstance() {

    if (singleton == null) {
        singleton = new singleton();
        return singleton;
    }

}

這種寫法只能在單線程下使用系枪,如果是多線程,可能發(fā)生一個線程通過并進入了if (singleton == null)判斷語句塊磕谅,但還未來得及創(chuàng)建新的實例時私爷,另一個線程也通過了這個判斷語句,兩個線程最終都進行了創(chuàng)建膊夹,導致多個實例的產生衬浑,所以在多線程環(huán)境下必須摒棄此方式

public class Singleton {

    private static Singleton singleton;

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

      return singleton;
  }
}

這種寫法通過給getInstance()方法添加了synchronized關鍵字,迫使每個線程在進入這個方法前放刨,要先等候別的線程離開該方法工秩,即不會有兩個線程可以同時進入該方法執(zhí)行new Singleton(),從而保證了單例的有效进统,但它的致命缺陷是效率太低了助币,每個線程每次執(zhí)行getInstance()方法獲取類的實例時,都會進行同步螟碎,而事實上實例創(chuàng)建完成后眉菱,同步就變?yōu)椴槐匾拈_銷了,這樣做在高并發(fā)下必然會拖垮性能掉分。

2.雙重檢查鎖定(Double Check Lock) 簡稱:DCL

public class Singleton {
    private static Singleton singleton;
    private Singleton() {

    }

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

此方法的Double-Check體現在進行了兩次if (singleton == null)的檢查俭缓,這樣即同步代碼塊保證了線程安全,同時實例化的代碼也只會執(zhí)行一次酥郭,實例化后同步操作不會再被執(zhí)行华坦,從而效率提升很多。
Android中鼎鼎大名的Universal Image LoaderEventBus都是采用了這種方式

public class SpHistoryStorage {

    private Context context;
    
    private static SpHistoryStorage instance;

    private SpHistoryStorage(Context context) {
        this.context = context.getApplicationContext();
    }

    public static synchronized SpHistoryStorage getInstance(Context context) {
        if (instance == null) {
            synchronized (SpHistoryStorage.class) {
                if (instance == null) {
                    instance = new SpHistoryStorage(context);
                }
            }
        }
        return instance;
    }
}

這是我在看別人的代碼的時候不从,人家這樣寫的惜姐。
后面的部分我都是看的這篇文章潛談單例模式這篇文章寫的很詳細

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市椿息,隨后出現的幾起案子载弄,更是在濱河造成了極大的恐慌耘拇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宇攻,死亡現場離奇詭異惫叛,居然都是意外死亡,警方通過查閱死者的電腦和手機逞刷,發(fā)現死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門嘉涌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夸浅,你說我怎么就攤上這事仑最。” “怎么了帆喇?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵警医,是天一觀的道長。 經常有香客問我坯钦,道長预皇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任婉刀,我火速辦了婚禮吟温,結果婚禮上,老公的妹妹穿的比我還像新娘突颊。我一直安慰自己鲁豪,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布律秃。 她就那樣靜靜地躺著爬橡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棒动。 梳的紋絲不亂的頭發(fā)上堤尾,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音迁客,去河邊找鬼。 笑死辞槐,一個胖子當著我的面吹牛掷漱,可吹牛的內容都是我干的。 我是一名探鬼主播榄檬,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼卜范,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鹿榜?” 一聲冷哼從身側響起海雪,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤锦爵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奥裸,有當地人在樹林里發(fā)現了一具尸體险掀,經...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年湾宙,在試婚紗的時候發(fā)現自己被綠了樟氢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡侠鳄,死狀恐怖埠啃,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情伟恶,我是刑警寧澤碴开,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站博秫,受9級特大地震影響潦牛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜台盯,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一罢绽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧静盅,春花似錦良价、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至市咽,卻和暖如春痊银,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背施绎。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工溯革, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谷醉。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓致稀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俱尼。 傳聞我的和親對象是個殘疾皇子抖单,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器矛绘,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,769評論 25 707
  • 實驗文本耍休。 Hello world! 詩意 大發(fā) 差別 大家 小字 斜體
    旅德行者閱讀 238評論 0 1
  • 清單就是減少我們犯錯誤的機會。清單能讓我把事情做正確货矮。 一羊精,人為什么會犯錯誤? 1,人往往會...
    網領天下閱讀 1,002評論 1 2
  • 今天項目中要嵌入別人的SDK次屠,但他們又沒有提供使用文檔园匹,這可苦了我,出現了這樣的錯誤劫灶。 花費了我好長時間才想起來哪...
    LuxDark閱讀 1,839評論 2 1