Android 單例模式筆記

單例設計模式是一種最常見的設計模式糙麦,其目的就是為了保證整個程序中只有一個實例歇攻,常見的場景都是一些特殊的類驮樊,比如管理類的實現(xiàn)粗恢。
實現(xiàn)單例模式方法:
1.構造函數(shù)私有柑晒,防止在外部 new 對象。
2.內(nèi)部提供一個靜態(tài)的方法眷射,讓外部調(diào)用來獲取這個單例匙赞。

餓漢式單例

/**
 * Created by zhangl on 2019/1/2.
 *
 *
 * 單例 - 餓漢式    隨著類的加載,就已經(jīng)new了對象
 *
 */
public class Singleton1 {
    private static Singleton1 mInstance = new Singleton1();
    private Singleton1(){
    }
    public static Singleton1 getInstance(){
        return mInstance;
    }
}

懶漢式單例

/**
 * Created by zhangl on 2019/1/2.
 *
 * 單例 - 懶漢式   只有在使用的時候才會去加載
 *
 */
public class Singleton2 {
    private static volatile Singleton2 mInstance;
    private Singleton2(){
    }
    public static Singleton2 getInstance(){
        if (mInstance == null){
            synchronized (Singleton2.class){
                if (mInstance == null){
                    mInstance = new Singleton2();
                }
            }
        }
        return mInstance;
    }
}

代碼中可以看到使用了volatile關鍵字妖碉,加上volatile關鍵的目的:
1.防止從排序 - JMM通過happens-before法則保證順序執(zhí)行語義涌庭,如果想要讓執(zhí)行操作B的線程觀察到執(zhí)行操作A的線程的結果,那么A和B就必須滿足happens-before原則欧宜,否則坐榆,JVM可以對它們進行任意排序以提高程序性能。
2.線程可見性 - 多線程環(huán)境下冗茸,某個共享變量如果被其中一個線程給修改了猛拴,其他線程能夠立即知道這個共享變量已經(jīng)被修改了,當其他線程要讀取這個變量的時候蚀狰,最終會去內(nèi)存中讀取愉昆,而不是從自己的工作空間中讀取。

關于volatile關鍵字麻蹋,可以寫一個測試類:

/**
 * Created by zhangl on 2019/1/2.
 */
public class VolatileTest {
    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
        new Thread(td).start();
        while(true){
            if(td.isFlag()){
                System.out.println("------------------");
                break;
            }
        }
        // 執(zhí)行結果跛溉? flag= true  ------------------
    }
}
class ThreadDemo implements Runnable {
    private volatile boolean flag = false;
    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
        }
        flag = true;
        System.out.println("flag=" + isFlag());
    }
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

測試結果如下:


volatile測試.png

利用單例模式實現(xiàn)Activity管理類:

/**
 * Created by zhangl on 2019/1/2.
 *
 *
 * Activity 管理類
 *
 *
 */
public class ActivityManager {
    private static volatile ActivityManager mInstance;
    private Stack<Activity> mActivitys;
    private ActivityManager(){
        mActivitys = new Stack<>();
    }
    public void attach(Activity activity){
        mActivitys.add(activity);
    }
    public void detach(Activity detachActivity){
        // 一邊循環(huán)一邊移除  會出問題
        /*for (Activity activity : mActivities) {
            if(activity == detachActivity){
                mActivities.remove(activity);
            }
        }*/
        int size = mActivitys.size();
        for (int i = 0;i < size;i++){
            Activity activity = mActivitys.get(i);
            if (activity == detachActivity){
                mActivitys.remove(i);
                i--;
                size--;
            }
        }
    }
    /**
     *  獲取當前Activity
     * @return
     */
    public Activity getCurrentActivity(){
        return mActivitys.lastElement();
    }

}



最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芳室,更是在濱河造成了極大的恐慌专肪,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堪侯,死亡現(xiàn)場離奇詭異嚎尤,居然都是意外死亡,警方通過查閱死者的電腦和手機伍宦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門芽死,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人次洼,你說我怎么就攤上這事关贵。” “怎么了卖毁?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵揖曾,是天一觀的道長。 經(jīng)常有香客問我亥啦,道長炭剪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任翔脱,我火速辦了婚禮奴拦,結果婚禮上,老公的妹妹穿的比我還像新娘碍侦。我一直安慰自己粱坤,他們只是感情好,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布瓷产。 她就那樣靜靜地躺著站玄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪濒旦。 梳的紋絲不亂的頭發(fā)上株旷,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音尔邓,去河邊找鬼晾剖。 笑死,一個胖子當著我的面吹牛梯嗽,可吹牛的內(nèi)容都是我干的齿尽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼灯节,長吁一口氣:“原來是場噩夢啊……” “哼循头!你這毒婦竟也來了绵估?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卡骂,失蹤者是張志新(化名)和其女友劉穎国裳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體全跨,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡缝左,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浓若。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渺杉。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖七嫌,靈堂內(nèi)的尸體忽然破棺而出少办,到底是詐尸還是另有隱情苞慢,我是刑警寧澤诵原,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站挽放,受9級特大地震影響绍赛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辑畦,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一吗蚌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纯出,春花似錦蚯妇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焕襟,卻和暖如春陨收,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸵赖。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工务漩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人它褪。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓饵骨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茫打。 傳聞我的和親對象是個殘疾皇子居触,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359