小白算法_楔子

前言

筆者屬于算法小白一枚,本系列文章屬于算法的學(xué)習(xí)筆記恨旱,也希望能給算法小小白起到些許的指引作用座慰。如果有算法大佬不小心點(diǎn)了進(jìn)來,只能說一聲抱歉打擾了械荷。

思考

作為本系列文章的楔子共耍,我們今天不討論算法解題,而是來談?wù)勔粋€老朋友:單例模式吨瞎。相信大家對單例是非常熟悉的痹兜,但是如果要讓你手寫單例呢?寫起來磕磕碰碰還是嫻熟流暢颤诀?你會寫幾種字旭?分別有什么區(qū)別?現(xiàn)在大家都在往 kotlin 轉(zhuǎn)崖叫,那么在 kotlin 里面使用 object 關(guān)鍵字實(shí)現(xiàn)的單例又采用的是哪種實(shí)現(xiàn)方式呢遗淳?筆者從事 android 開發(fā)多年,在幾個互聯(lián)網(wǎng)大廠的面試中心傀,經(jīng)歷了兩次手寫單例的考驗(yàn)屈暗,所以在這里以手寫單例為楔子,為后面的手寫算法起一個拋磚引玉的作用脂男。

正文

什么是單例模式

在同一個進(jìn)程中养叛,有些時候我們需要某個類同時只保留一個對象,這個時候就應(yīng)該考慮單例模式的設(shè)計(jì)疆液。

單例模式的特點(diǎn)

  • 單例模式只能有一個實(shí)例對象
  • 單例模式必須創(chuàng)建自己的唯一實(shí)例
  • 單例模式必須對外部提供這一實(shí)例

單例模式的實(shí)現(xiàn)

餓漢式

public class Singleton {

    private static Singleton INSTANCE = new Singleton();

    private Singleton(){
    }

    public static Singleton getInstance(){
        return INSTANCE;
    }
}

優(yōu)點(diǎn):線程安全一铅,使用沒有延遲。
缺點(diǎn):類加載即初始化實(shí)例堕油,內(nèi)存浪費(fèi)潘飘。

面試官追問:為什么線程安全肮之?

  1. 餓漢式本質(zhì)上是使用的是靜態(tài)變量。
  2. 在類加載的過程中卜录,靜態(tài)變量就會進(jìn)行初始化戈擒。
  3. 靜態(tài)變量只會初始化一次,并且被所有的對象所共享艰毒。

懶漢式

public class Singleton {

    private volatile static Singleton INSTANCE = null;

    private Singleton() {
    }

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

優(yōu)點(diǎn):懶加載節(jié)省資源筐高,線程安全。
缺點(diǎn):線程同步存在性能損耗

面試官追問:為什么采用雙重鎖檢驗(yàn)丑瞧?為什么使用 volatile 關(guān)鍵字柑土?

  1. 線程同步是存在性能損耗的,我們只需要在實(shí)際創(chuàng)建對象的時候進(jìn)行同步绊汹,而不需要同步多余的代碼稽屏。
  2. 第一重校驗(yàn)不為 null 的時候,直接返回對象西乖。否則準(zhǔn)備創(chuàng)建對象狐榔,此時需要進(jìn)行線程同步。
  3. 在創(chuàng)建對象之前還需要進(jìn)行第二重校驗(yàn)获雕,是為了確保等待同步的線程不會重復(fù)創(chuàng)建對象薄腻。
  4. 使用 volatile 關(guān)鍵字是為了禁止指令重排,確保對象初始化完全届案。

靜態(tài)內(nèi)部類

public class Singleton {

    private Singleton() {
    }

    private static class SingletonHolder {
        private static Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

優(yōu)點(diǎn):懶加載節(jié)省資源庵楷,無性能損耗的線程安全

面試官追問:如何實(shí)現(xiàn)的懶加載?為什么線程安全

  1. 靜態(tài)內(nèi)部類只有被調(diào)用的時候才會加載萝玷,滿足懶加載嫁乘。
  2. 靜態(tài)內(nèi)部類在加載的時候,jvm 會保證線程安全球碉。

總結(jié)

單例模式的實(shí)現(xiàn)很多蜓斧,我們這里只取精華,只講重點(diǎn)睁冬。最關(guān)鍵的是在面試過程中挎春,你是否可以在純文本編輯的環(huán)境下嫻熟的手寫以上幾種不同的單例,然后從容的告訴面試官它們之間的區(qū)別豆拨,最后再承受住面試官深挖的幾個為什么直奋。

借一句古語,與諸君共勉:紙上得來終覺淺施禾,絕知此事要躬行脚线。

一個小小的單例提醒了我們,在后面的算法學(xué)習(xí)中要腳踏實(shí)地的手寫算法解題弥搞,切記不可只做頭腦風(fēng)暴邮绿。在大廠的高級職位面試過程中渠旁,面試官最喜歡做的就是讓求職者手寫點(diǎn)代碼。不需要太多船逮,也不需要太難顾腊,就已經(jīng)可以看出很多東西了。兩位求職者挖胃,一個手寫起來嫻熟流暢杂靶,代碼強(qiáng)壯,格式工整酱鸭。另外一個先不說測試用例是否通過吗垮,寫的過程都磕磕碰碰。你是面試官凹髓,你會如何抉擇呢抱既?

最后附上 kotlin 通過 object 關(guān)鍵字實(shí)現(xiàn)單例的字節(jié)碼反編譯出來的 java 源代碼,跟你想的是否一樣呢扁誓?

public final class Singleton {
   public static final Singleton INSTANCE;

   private Singleton() {
   }

   static {
      Singleton var0 = new Singleton();
      INSTANCE = var0;
   }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚀之,隨后出現(xiàn)的幾起案子蝗敢,更是在濱河造成了極大的恐慌,老刑警劉巖足删,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寿谴,死亡現(xiàn)場離奇詭異,居然都是意外死亡失受,警方通過查閱死者的電腦和手機(jī)讶泰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拂到,“玉大人痪署,你說我怎么就攤上這事⌒盅” “怎么了狼犯?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長领铐。 經(jīng)常有香客問我悯森,道長,這世上最難降的妖魔是什么绪撵? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任瓢姻,我火速辦了婚禮,結(jié)果婚禮上音诈,老公的妹妹穿的比我還像新娘幻碱。我一直安慰自己绎狭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布收班。 她就那樣靜靜地躺著坟岔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摔桦。 梳的紋絲不亂的頭發(fā)上社付,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音邻耕,去河邊找鬼鸥咖。 笑死,一個胖子當(dāng)著我的面吹牛兄世,可吹牛的內(nèi)容都是我干的啼辣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼御滩,長吁一口氣:“原來是場噩夢啊……” “哼鸥拧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起削解,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤富弦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后氛驮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腕柜,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年矫废,在試婚紗的時候發(fā)現(xiàn)自己被綠了盏缤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蓖扑,死狀恐怖唉铜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赵誓,我是刑警寧澤打毛,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站俩功,受9級特大地震影響幻枉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诡蜓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一熬甫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔓罚,春花似錦椿肩、人聲如沸瞻颂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贡这。三九已至,卻和暖如春厂榛,著一層夾襖步出監(jiān)牢的瞬間盖矫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工击奶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辈双,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓柜砾,卻偏偏與公主長得像湃望,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痰驱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348