發(fā)布對象

發(fā)布對象

  • 發(fā)布對象 :使一個(gè)對象能夠被當(dāng)前范圍之外的代碼所使用
  • 對象溢出: 一種錯(cuò)誤的發(fā)布。當(dāng)一個(gè)對象還沒有構(gòu)造完成時(shí)脏毯,就使它被其他線程所見(類的非私有方法返回對象的引用滴某、通過公有靜態(tài)變量發(fā)布對象)

安全發(fā)布對象

  • 在對象初始化函數(shù)中初始化一個(gè)對象引用

  • 將對象的引用保存到volatile類型域或者AtomicReference對象中

  • 將對象的應(yīng)用保存到某個(gè)正確構(gòu)造對象的final類型域中

  • 將對象的引用保存到一個(gè)由鎖保護(hù)的域中

    1.懶漢模式 線程不安全

package com.qjx.concurrency.singleton;


import com.qjx.concurrency.annotations.NotThreadSafe;

/**
 * 單例
 * 懶漢模式
 * 單例的實(shí)例在第一次運(yùn)行的時(shí)候進(jìn)行創(chuàng)建
 * 單線程下安全 乡翅,多線程下不安全
 */
@NotThreadSafe
public class SingletonExample1 {
    /**
     * 私有構(gòu)造函數(shù)
     */
    private SingletonExample1(){

    }

    /**
     * 單例對象
     */
    public static SingletonExample1 instance= null;

    /**
     * 靜態(tài)的工廠方法
     * @return
     */
    public static SingletonExample1 getInstance(){
        if(instance==null){
            instance = new SingletonExample1();
        }
        return instance;
    }
}

  • 2.餓模式 線程安全

    單例的實(shí)例在類裝載的時(shí)候進(jìn)行創(chuàng)建

    餓漢模式可能會導(dǎo)致線程資源的浪費(fèi)

    使用的時(shí)候注意的問題:

    1.私有構(gòu)造函數(shù)在實(shí)現(xiàn)的時(shí)候沒有太多的處理剪个,不然會導(dǎo)致該類加載過慢秧骑,出現(xiàn)性能問題

    2.在使用過程中存在實(shí)際調(diào)用,不然會導(dǎo)致資源浪費(fèi)

package com.qjx.concurrency.singleton;


import com.qjx.concurrency.annotations.ThreadSafe;

/**
 * 單例
 * 餓漢模式
 * 單例的實(shí)例在類裝載的時(shí)候進(jìn)行創(chuàng)建
 * 餓漢模式可能會導(dǎo)致線程資源的浪費(fèi)
 * 使用的時(shí)候注意的問題:
 * 1.私有構(gòu)造函數(shù)在實(shí)現(xiàn)的時(shí)候沒有太多的處理扣囊,不然會導(dǎo)致該類加載過慢乎折,出現(xiàn)性能問題
 * 2.在使用過程中存在實(shí)際調(diào)用,不然會導(dǎo)致資源浪費(fèi)
 */
@ThreadSafe
public class SingletonExample2 {
    /**
     * 私有構(gòu)造函數(shù)
     */
    private SingletonExample2(){

    }

    /**
     * 單例對象
     */
    public static SingletonExample2 instance= new SingletonExample2();

    /**
     * 靜態(tài)的工廠方法
     * @return
     */
    public static SingletonExample2 getInstance(){
        return instance;
    }
}

  • 3.懶漢模式 引入靜態(tài)方法鎖 線程安全

    單例的實(shí)例在第一次運(yùn)行的時(shí)候進(jìn)行創(chuàng)建

    不推薦如暖,因?yàn)橹苯右雽ο箧i導(dǎo)致效率低

package com.qjx.concurrency.singleton;


import com.qjx.concurrency.annotations.NotRecommend;
import com.qjx.concurrency.annotations.ThreadSafe;

/**
 * 單例
 * 懶漢模式
 * 單例的實(shí)例在第一次運(yùn)行的時(shí)候進(jìn)行創(chuàng)建
 */
@ThreadSafe
@NotRecommend
public class SingletonExample3 {
    /**
     * 私有構(gòu)造函數(shù)
     */
    private SingletonExample3(){

    }

    /**
     * 單例對象
     */
    public static SingletonExample3 instance= null;

    /**
     * 靜態(tài)的工廠方法
     * @return
     */
    public static synchronized SingletonExample3 getInstance(){
        if(instance==null){
            instance = new SingletonExample3();
        }
        return instance;
    }
}

  • 4.懶漢模式 線程不安全

    主要原因是JVM和CPU優(yōu)化笆檀,發(fā)生了指令重排

    懶漢模式 -》 雙重同步鎖單例模式

    單例的實(shí)例在第一次運(yùn)行的時(shí)候進(jìn)行創(chuàng)建

package com.qjx.concurrency.singleton;


import com.qjx.concurrency.annotations.NotThreadSafe;

/**
 * 單例
 * 懶漢模式 -》 雙重同步鎖單例模式
 * 單例的實(shí)例在第一次運(yùn)行的時(shí)候進(jìn)行創(chuàng)建
 */
@NotThreadSafe
public class SingletonExample4 {
    /**
     * 私有構(gòu)造函數(shù)
     */
    private SingletonExample4(){

    }

    //1.memory = allocate() 分配對象的內(nèi)存空間
    //2.ctorInstance() 初始化對象
    //3.instance = memory 設(shè)置instance 指向剛分配的內(nèi)存

    //jvm 和cpu優(yōu)化,發(fā)生了指令重排

    //1.memory = allocate() 分配對象的內(nèi)存空間
    //3.instance = memory 設(shè)置instance 指向剛分配的內(nèi)存
    //2.ctorInstance() 初始化對象


    /**
     * 單例對象
     */
    public static SingletonExample4 instance= null;

    /**
     * 靜態(tài)的工廠方法
     * @return
     */
    public static SingletonExample4 getInstance(){
        //雙重檢測機(jī)制
        if(instance==null){
            //同步鎖
            synchronized (SingletonExample4.class){
                if(instance == null){
                    instance = new SingletonExample4();
                }
            }
        }
        return instance;
    }
}

  • 5.懶漢模式 引入volatile+雙重檢測機(jī)制禁止指令重拍使線程安全

package com.qjx.concurrency.singleton;


import com.qjx.concurrency.annotations.ThreadSafe;

/**
 * 單例
 * 懶漢模式 -》 雙重同步鎖單例模式
 * 單例的實(shí)例在第一次運(yùn)行的時(shí)候進(jìn)行創(chuàng)建
 */
@ThreadSafe
public class SingletonExample5 {
    /**
     * 私有構(gòu)造函數(shù)
     */
    private SingletonExample5(){

    }

    //1.memory = allocate() 分配對象的內(nèi)存空間
    //2.ctorInstance() 初始化對象
    //3.instance = memory 設(shè)置instance 指向剛分配的內(nèi)存


    /**
     * 單例對象 volatile + 雙重檢測機(jī)制 -> 禁止指令重拍
     */
    public volatile static SingletonExample5 instance= null;

    /**
     * 靜態(tài)的工廠方法
     * @return
     */
    public static SingletonExample5 getInstance(){
        //雙重檢測機(jī)制
        if(instance==null){
            //同步鎖
            synchronized (SingletonExample5.class){
                if(instance == null){
                    instance = new SingletonExample5();
                }
            }
        }
        return instance;
    }
}

  • 6.餓漢模式 線程安全

    靜態(tài)代碼塊

package com.qjx.concurrency.singleton;


import com.qjx.concurrency.annotations.ThreadSafe;

/**
 * 單例
 * 餓漢模式
 * 單例的實(shí)例在類裝載的時(shí)候進(jìn)行創(chuàng)建
 * 餓漢模式可能會導(dǎo)致線程資源的浪費(fèi)
 * 使用的時(shí)候注意的問題:
 * 1.私有構(gòu)造函數(shù)在實(shí)現(xiàn)的時(shí)候沒有太多的處理盒至,不然會導(dǎo)致該類加載過慢,出現(xiàn)性能問題
 * 2.在使用過程中存在實(shí)際調(diào)用,不然會導(dǎo)致資源浪費(fèi)
 */
@ThreadSafe
public class SingletonExample6 {
    /**
     * 私有構(gòu)造函數(shù)
     */
    private SingletonExample6(){

    }

    /**
     * 單例對象
     */
    public static SingletonExample6 instance= null;

    static {
        instance = new SingletonExample6();
    }


    /**
     * 靜態(tài)的工廠方法
     * @return
     */
    public static SingletonExample6 getInstance(){
        return instance;
    }

    public static void main(String[] args) {
        System.out.println(getInstance().hashCode());
        System.out.println(getInstance().hashCode());
    }
}

  • 7.枚舉模式 線程安全 (最安全)

    推薦使用

package com.qjx.concurrency.singleton;


import com.qjx.concurrency.annotations.Recommend;
import com.qjx.concurrency.annotations.ThreadSafe;

/**
 * 單例
 * 枚舉模式
 * 最安全
 */
@ThreadSafe
@Recommend
public class SingletonExample7 {
    /**
     * 私有構(gòu)造方法
     */
    private SingletonExample7 (){

    }

    public static SingletonExample7 getInstance(){
        return Singleton.SINGLETON.getInstance();
    }

    /**
     * 枚舉類定義單利實(shí)現(xiàn)
     */
    private enum Singleton{
        /**
         * 枚舉單例
         */
        SINGLETON;
        private SingletonExample7 singleton;

        /**
         * JVM保證這個(gè)方法絕對只被調(diào)用一次
         */
        Singleton(){
            singleton = new SingletonExample7();
        }

        public SingletonExample7 getInstance(){
            return singleton;
        }
    }


}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枷遂,一起剝皮案震驚了整個(gè)濱河市樱衷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酒唉,老刑警劉巖矩桂,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痪伦,居然都是意外死亡侄榴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門网沾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來癞蚕,“玉大人,你說我怎么就攤上這事辉哥¤肷剑” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵醋旦,是天一觀的道長恒水。 經(jīng)常有香客問我,道長饲齐,這世上最難降的妖魔是什么钉凌? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮捂人,結(jié)果婚禮上甩骏,老公的妹妹穿的比我還像新娘。我一直安慰自己先慷,他們只是感情好饮笛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著论熙,像睡著了一般福青。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脓诡,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天无午,我揣著相機(jī)與錄音,去河邊找鬼祝谚。 笑死宪迟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的交惯。 我是一名探鬼主播次泽,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼穿仪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了意荤?” 一聲冷哼從身側(cè)響起啊片,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玖像,沒想到半個(gè)月后紫谷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捐寥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年笤昨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片握恳。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞒窒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出睡互,到底是詐尸還是另有隱情根竿,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布就珠,位于F島的核電站寇壳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妻怎。R本人自食惡果不足惜壳炎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逼侦。 院中可真熱鬧匿辩,春花似錦、人聲如沸榛丢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晰赞。三九已至稼病,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掖鱼,已是汗流浹背然走。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戏挡,地道東北人芍瑞。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像褐墅,于是被迫代替她去往敵國和親拆檬。 傳聞我的和親對象是個(gè)殘疾皇子洪己,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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