Java單例模式

單例的5中方式

1、懶漢式

缺點(diǎn):線程不安全

/**
     * 懶漢式
     * 缺點(diǎn):線程不安全的
     */
    static class LazyClass {
        private static LazyClass lazyClass = null;
        private LazyClass (){}

        public static LazyClass getInstance(){
            if(lazyClass == null) {
                lazyClass = new LazyClass();
            }
            return lazyClass;
        }
    }

2匀泊、懶漢式變種(雙重檢查加鎖)

/**
     * 懶漢式變種
     * 注意此處的變量必須加volatile修飾 如果不加volatile可能造成線程不安全
     * 主要原因是英文 doubleCheckClass = new DoubleCheckClass() 不是原子操作
     * 其中分為三步,第一步開(kāi)辟內(nèi)存空間揣非,第二步初始化對(duì)象躲因, 第三步賦值引用,其中在高并發(fā)場(chǎng)景下可能發(fā)生指重排
     * 雙重檢查加鎖
     */
    static class DoubleCheckClass {
        private static volatile DoubleCheckClass doubleCheckClass = null;

        private DoubleCheckClass(){}

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

3搁嗓、餓漢式

/**
 *餓漢式
*缺點(diǎn):一上來(lái)就初始化空間,不是用也要占用內(nèi)存空間
*/
static class HungryClass {
    private static HungryClasshungryClass= new HungryClass();

    private HungryClass(){}

    public static HungryClass getInstance(){
        returnhungryClass;
    }
}

4腺逛、靜態(tài)內(nèi)部類方式

/**
     * 靜態(tài)內(nèi)部類方式實(shí)現(xiàn)
     */
    static class InnerClass {
        private static class  InnerClassHolder {
            /**
             * 靜態(tài)類初始化 JVM來(lái)保證線程安全
             */
            private static  InnerClass innerClass = new InnerClass();
        }

        private InnerClass(){}

        public static InnerClass getInstance(){
            return InnerClassHolder.innerClass;
        }
    }

5衡怀、枚舉

/**
 *枚舉方式實(shí)現(xiàn)單例
*/
static enum EnumClass {
instance;

}

破壞單例的三種方式

1、反射

解決方案:定義一個(gè)全局變量抛杨,當(dāng)?shù)诙蝿?chuàng)建時(shí)候就拋出異常

2、克隆

解決方案:重寫clone方法茁帽,直接返回當(dāng)前單例對(duì)象

3、序列化

解決防范:添加readResolve() 返回單例對(duì)象

/**
     * 破壞單例的幾種方式
     * 1潘拨、反射
     * 2、克隆
     * 3季蚂、序列化
     *
     * 解決方法
     * 1琅束、反射
     *    定義一個(gè)全局變量扭屁,當(dāng)?shù)诙蝿?chuàng)建的時(shí)候拋出異常
     * 2涩禀、克隆
     *   重寫clone(),直接返回單例對(duì)象
     * 3、序列化
     *    添加readResolve(),返回Object對(duì)象
     */
    static class Singleton  implements Serializable,Cloneable{

        private static volatile boolean isCreate = false;//默認(rèn)是第一次創(chuàng)建
        /**
         * 1.構(gòu)造方法私有化幔欧,外部不能new
         */
        private Singleton() {
            if(isCreate) {
                throw new RuntimeException("已然被實(shí)例化一次丽声,不能在實(shí)例化");
            }
            isCreate = true;
        }

        //2.本類內(nèi)部創(chuàng)建對(duì)象實(shí)例
        private static  volatile  Singleton instance;

        //3.提供一個(gè)公有的靜態(tài)方法,返回實(shí)例對(duì)象
        public static  Singleton getInstance() {
            if(instance == null) {
                synchronized (Singleton.class) {
                    if(instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }

        @Override
        protected Object clone() throws CloneNotSupportedException {
            return instance;
        }

        /**
         * 防止序列化破環(huán)
         * @return
         */
        private Object readResolve() {
            return instance;
        }

    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浴井,一起剝皮案震驚了整個(gè)濱河市霉撵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徒坡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伦泥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡不脯,警方通過(guò)查閱死者的電腦和手機(jī)刻诊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)复局,“玉大人冲簿,你說(shuō)我怎么就攤上這事亿昏。” “怎么了龙优?”我有些...
    開(kāi)封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵彤断,是天一觀的道長(zhǎng)易迹。 經(jīng)常有香客問(wèn)我宰衙,道長(zhǎng)睹欲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任袋哼,我火速辦了婚禮闸衫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔚出。我一直安慰自己,他們只是感情好骄酗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布趋翻。 她就那樣靜靜地躺著睛琳,像睡著了一般踏烙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宙帝,一...
    開(kāi)封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天步脓,我揣著相機(jī)與錄音愿待,去河邊找鬼。 笑死要出,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的患蹂。 我是一名探鬼主播砸紊,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼醉顽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起系草,我...
    開(kāi)封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唆涝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后廊酣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚎京,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年隐解,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煞茫。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚓曼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纫版,我是刑警寧澤客情,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布癞己,位于F島的核電站梭伐,受9級(jí)特大地震影響痹雅,放射性物質(zhì)發(fā)生泄漏糊识。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一愉耙、第九天 我趴在偏房一處隱蔽的房頂上張望哑梳。 院中可真熱鬧,春花似錦鸠真、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至路操,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屯仗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工桩撮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留峰弹,地道東北人店量。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓鞠呈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蚁吝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霹粥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 今天感恩節(jié)哎后控,感謝一直在我身邊的親朋好友。感恩相遇浩淘!感恩不離不棄。 中午開(kāi)了第一次的黨會(huì)张抄,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,566評(píng)論 0 11
  • 彩排完洼怔,天已黑
    劉凱書法閱讀 4,218評(píng)論 1 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒极谊。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了安岂,難過(guò)就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,038評(píng)論 2 7